在ToString()之前检查null

这是场景…

if (entry.Properties["something"].Value != null) attribs.something = entry.Properties["something"].Value.ToString(); 

虽然有效和正确工作,这对我来说看起来很丑。 如果在执行ToString()之前不检查null,那么如果属性为null,则会引发exception。 有没有更好的方法来处理这种情况?

非常感激!

8年后更新(哇!)覆盖c#6的空条件运算符 :

 var value = maybeNull?.ToString() ?? "" 

其他方法:

 object defaultValue = "default"; attribs.something = (entry.Properties["something"].Value ?? defaultValue).ToString() 

我也用过这个,这不是非常聪明但很方便:

 public static string ToSafeString(this object obj) { return (obj ?? string.Empty).ToString(); } 

如果你的目标是.NET Framework 3.5,我认为最优雅的解决scheme将是一个扩展方法。

 public static class ObjectExtensions { public static string NullSafeToString(this object obj) { return obj != null ? obj.ToString() : String.Empty; } } 

然后使用:

 attribs.something = entry.Properties["something"].Value.NullSafeToString(); 
 Convert.ToString(entry.Properties["something"].Value); 

向对象中添加一个空string是一个常见的习惯用法,可以让您执行空置ToString转换,如下所示:

 attribs.something = ""+entry.Properties["something"].Value; 

entry.Properties["something"].Value值为null ,这会安静地返回一个空string

编辑:从C#6开始,你可以使用?. 运算符以更简单的方式避免null检查:

 attribs.something = entry.Properties["something"].Value?.ToString(); // ^^ 

你不能这样做吗:

 attribs.something = entry.Properties["something"].Value as string; 
 attribs.something = String.Format("{0}", entry.Properties["something"].Value); 

不确定性能虽然…

作为RexM答案的一个变种:

 attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString() 

唯一的缺点是,即使entry.Properties [“something”],attribs.something会被分配一个值(在本例中就是它本身)。Value为null – 如果.something属性做了一些其他处理和/或这一行执行很多(如循环)。

要准确地做你想做的事情,总是可以使用一个辅助方法:

 CopyIfNotNull(entry.Properties["something"].Value, out attribs.something); void CopyIfNotNull(string src, out string dest) { if(src != null) dest = src; } 

是否有可能做类似上面的Dale Ragan的回答 ,但重写ToString()而不是创build一个新的NullSafeToString()方法? 我想这个(或返回“null”)是默认行为。 编译器(Visual C#2010 Express)没有抱怨,当我将下面的方法添加到公共静态类ObjectExtensions,但方法不会被调用…

 public static String ToString(this Object obj) { if (obj == null) { return "null"; } else { return obj.GetType().Name; } } 
 attribs.something = string.Format("{0}",entry.Properties["something"].Value) 

在C#6.0中,你可以用一种非常优雅的方式来做到这一点:

attribs.something = entry.Properties["something"].Value?.ToString();

这里是关于新的空条件运算符的文章。

如何使用这样的辅助方法:

 attribs.something = getString( entry.Properties["something"].Value, attribs.something); static String getString( Object obj, String defaultString) { if (obj == null) return defaultString; return obj.ToString(); } 

或者,你可以使用?? 运营商:

 attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString(); 

(注意值为null时的冗余ToString()调用)