在ToString()之前检查null

时间:2009-02-15 05:34:36

标签: c# .net string properties

这是场景......

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

虽然有效且正常工作,但这看起来很难看。如果我在执行ToString()之前没有检查null,那么如果属性为null,则抛出异常。有没有更好的方法来处理这种情况?

非常感谢!

12 个答案:

答案 0 :(得分:121)

8年后更新(哇!)以涵盖c# 6's null-conditional operator

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

答案 1 :(得分:41)

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

答案 2 :(得分:38)

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

答案 3 :(得分:3)

向对象添加空字符串是一种常见的习惯用法,可让您进行无效安全ToString转换,如下所示:

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

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

修改:从C#6开始,您可以使用?.运算符来避免null以更简单的方式进行检查:

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

答案 4 :(得分:2)

你不能这样做:

attribs.something = entry.Properties["something"].Value as string;

答案 5 :(得分:2)

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

虽然不确定性能......

答案 6 :(得分:1)

作为RexM答案的变体:

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

唯一的缺点是即使entry.Properties [“something”],attribs.something也会被分配一个值(在本例中也是如此)。值为null - 如果.something属性确实可能会很昂贵一些其他处理和/或这一行执行很多(如在循环中)。

答案 7 :(得分:1)

要准确地执行您要执行的操作,始终可以使用辅助方法:

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

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

在某种程度上可以做某些事情 Dale Ragan's answer above,但是重写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;
    }
}

答案 10 :(得分:1)

在C#6.0中,您可以非常优雅地完成这项工作:

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

这是一篇关于新null-conditional operator的文章。

答案 11 :(得分:0)

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

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