这是场景...
if (entry.Properties["something"].Value != null)
attribs.something = entry.Properties["something"].Value.ToString();
虽然有效且可以正常工作,但对我来说这看起来很丑。如果我在执行ToString()之前不检查null,那么如果该属性为null,它将引发异常。有没有更好的方法来处理这种情况?
非常感激!
这是场景...
if (entry.Properties["something"].Value != null)
attribs.something = entry.Properties["something"].Value.ToString();
虽然有效且可以正常工作,但对我来说这看起来很丑。如果我在执行ToString()之前不检查null,那么如果该属性为null,它将引发异常。有没有更好的方法来处理这种情况?
非常感激!
Answers:
8年后更新(哇!),涵盖了C#6的空条件运算符:
var value = maybeNull?.ToString() ?? String.Empty;
其他方法:
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为目标,那么我认为最优雅的解决方案是扩展方法。
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();
向对象添加空字符串是一种常见的习惯用法,它使您可以进行空安全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);
虽然不确定性能...
要精确地执行您尝试执行的辅助方法,可以始终使用:
CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);
void CopyIfNotNull(string src, out string dest)
{
if(src != null)
dest = src;
}
是否可以执行类似 Dale Ragan上面的答案的方法,但是重写ToString()而不是创建新的NullSafeToString()方法?我希望这个(或返回“ null”)成为默认行为。当我将以下方法添加到公共静态类ObjectExtensions时,编译器(Visual C#2010 Express)不会抱怨,但是该方法不会被调用...
public static String ToString(this Object obj)
{
if (obj == null)
{
return "null";
}
else
{
return obj.GetType().Name;
}
}
如何使用这样的辅助方法:
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();
(请注意ToString()
当值为时的冗余调用null
)