在 ToString()之前检查 null

情况是这样的..。

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

虽然有效和正确的工作,这看起来难看的我。如果在执行 ToString ()之前没有检查 null,那么如果属性为 null,它将引发异常。有更好的方法来处理这种情况吗?

非常感谢!

87205 次浏览

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();
}

作为 RexM 答案的一个变体:

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

唯一的缺点是,即使条目符合条件,Attribs.something 也会被赋值(在本例中是它自己)。物业〔“某物”〕。值为空-如果。Something 属性执行了其他处理,并且/或者这一行执行了很多操作(比如在循环中)。

使用这样的辅助方法怎么样:

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()调用)

为了准确地完成你正在尝试做的事情,助手方法总是可以使用的:

CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);


void CopyIfNotNull(string src, out string dest)
{
if(src != null)
dest = src;
}

如果你的目标是.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();

你能不能:

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

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

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);

虽然不太确定表现如何。

向对象添加空字符串是一种常见的习惯做法,它允许执行空安全的 ToString转换,如下所示:

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

entry.Properties["something"].Valuenull时,这会悄悄地返回一个空的 string

编辑: 从 C # 6开始,你可以使用 ?.操作符来避免 null检查,这是一种更简单的方法:

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

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

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

这里有一篇关于新 空条件运算符的文章。