2012-07-30 78 views
3

这是一件不是真正的问题,我很抱歉,如果这是一个愚蠢的问题,但它只是我很好奇。假设我想将字符串参数解析为一个整数,如果该字符串不为空,则将该整数设置为-1。有没有更好的方式来写这样一句话:C#解析值如果不为空

int id = context.Request["Id"] == null ? -1 : int.Parse(context.Request["Id"]); 

这似乎只是凌乱有评估字符串,看它是否是空,然后再对其进行评估分析它。现在我已经想到了,如果它不为null,那么就会出现对象并访问对象属性。所以像这样:

int id = person == null ? -1 : person.id; 

这是公认的做法?

回答

11

对于你的第一个例子中,你可以使用null coalescing operator

int id = int.Parse(context.Request["Id"] ?? "-1"); 

如果存在一个null-safe dereferencing operator但因为它没有在C#中存在的第二个例子可以改进,你的做法是罚款:

int id = person == null ? -1 : person.Id; 
+1

打我吧:) – Mastermnd 2012-07-30 19:47:47

+1

这确实会导致不必要的'int.Parse(“ - 1”)',但是,而不是直接将值设置为-1。 – 2012-07-30 19:51:51

+0

我甚至没有想过在将参数传递给解析方法时进行空检查,doh!现在看起来很简单。是的,无效的解引用操作符正是我所期待的,很高兴知道它存在,而不是C#。谢谢! – BurkDiggler 2012-07-30 20:12:41

1

就个人而言,我将使这两个语句:

string tmp = context.Request["Id"]; 
int id = String.IsNullOrWhitespace(tmp) ? -1 : int.Parse(tmp); 

这处理这个没有任何额外的解析。在一行中执行此操作需要额外查看上下文(您试图避免的)或额外的解析。

+1

IsNullOrWhitespace?以及其他所有不是数字的内容? int.TryParse对我来说似乎是一个更好的解决方案。 – 2012-07-30 19:58:48

+1

@WouterH是的 - 这不处理非数字输入 - 但它更多的是试图解决处理空值与整数解析的具体问题。 – 2012-07-30 20:02:04

2

您没有说明int.Parse()是否有失败的非空值的潜力,但如果你不能确定一个非空输入字符串将永远是一个int值,您还可以使用TryParse()方法:如果context.Request["Id"]是空

int id; 
if (!int.TryParse(context.Request["Id"], out id) 
    id = -1; 

这不会抛出异常,或者如果它不能分析到int

+0

,看起来像我的答案似乎exaclty :)看起来像我们在同一时刻打字相同的字符。 – 2012-07-30 19:56:05

+0

无论如何+1,因为它是更好的准备非数字输入,而不是捕捉异常。 – 2012-07-30 19:57:56