2011-04-04 42 views
1

它是可以使用的情况??操作,这样的:使用空合并与属性或调用方法

string str = collection["NoRepeate"] ?? null; // Will not compile 
          //because collection["NoRepeate"] is object 

这里的问题是,它是不能分配collection["NoRepeate"]这是objectstrcollection["NoRepeate"].ToString()当它的值为空时抛出异常。

我现在使用条件运算?:

str = collection["NoRepeate"].HasValue ? collection["NoRepeate"].ToString() : null 

但问题是重复的常量字符串。

+1

对于第一条语句:如果'collection [“NoRepeate”]是非空的,那么'??零“部分被忽略。如果它是空的,那么它已经是'空'了,所以'??空'是多余的。 – kennytm 2011-04-04 16:11:48

+0

我同意KennyTM。在null合并运算符中放置'null'是没有意义的。该运算符的目的是查找第一个非空值。我会认为只是字符串str =集合[“NoRepeate”];将是你想要的。 – 2011-04-04 16:24:30

+0

'collection [“NoRepeate”]'是对象,我写道这不会编译。 – Homam 2011-04-04 16:29:06

回答

3

我同意你的看法,这不能在一个陈述中完成。空合并运算符在这里没有帮助。

我知道的最短的需要两条语句。

object obj = collection["NoRepeate"]; 
string str = obj == null ? null : obj.ToString(); 
0

是的,如果返回的值为null,那么这是非常可能的。如果返回的值是“”,则不。我一直使用它的空值来分配默认值。

+0

为什么downvote不爱? – jcolebrand 2011-04-04 17:07:56

+0

还要注意并非所有东西都可以为空(如果'object'应该可以为空) – jcolebrand 2011-04-04 17:09:11

1

我的解决办法是:

var field = "NoRepeate"; 

var str = collection[field].HasValue ? collection[field].ToString() : null; 

当然,如果你没有primitive obsessions你可以添加一个方法集合类您这样做。否则,你可能不得不坚持使用扩展方法。

+1

这样做并不理想,因为它需要两次进入字典,这可能很昂贵。 – Talljoe 2011-04-04 16:19:48

+0

我以为这就是为什么你使用字典 - 基于键的查找是为了便宜 – 2011-04-05 08:11:36

+0

他们是,但他们不是免费的。一个字符串必须每次计算其哈希码,然后字典必须选择合适的存储桶,然后它通过比较每个字符串的存储桶,直到它找到匹配。它比蛮力搜索更快,但不是魔法。 – Talljoe 2011-04-05 16:03:43

1

是否从集合中返回的对象实际上是Nullable<object>?否则,你可能想明确地检查空:

var item = collection["NoRepeate"]; 
string str = (item == null) ? null : item.ToString(); 
+0

'item == null'和'!item.HasValue'有什么区别? – Homam 2011-04-04 16:17:43

+0

由于Nullable具有T是结构的约束,因此不可能使用可空的。 – BrandonAGr 2011-04-04 16:34:35

+0

@BrandonAGr:良好的通话,编辑。 – 2011-04-04 17:10:42

1

你可以做到以下几点:

string str = (string) collection["NoRepeate"] ?? null; 

这是假设的对象实际上是一个字符串,但。如果不是,你会得到一个运行时错误。其他解决方案更强大。

尽管如此,尽可能缩短这一点并没有什么实际意义。你应该让你的代码可读,而不是“我能写多少?”