在ToString()之前检查null


76

这是场景...

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

虽然有效且可以正常工作,但对我来说这看起来很丑。如果我在执行ToString()之前不检查null,那么如果该属性为null,它将引发异常。有没有更好的方法来处理这种情况?

非常感激!


那么,如果该值为null,输出应该是什么?
Zach Scrivena 09年

它将使用分配给
attribs.something

@dscoduc我正在寻找2009年的HTA jQuery信息。您的博客和网站似乎处于离线状态。
yzorg 2012年


2
我的问题是从2009年开始的,您提到的一个是从2010年开始的...所以另一个是我的副本,不是吗?
Dscoduc '16

Answers:


128

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

1
您是否能立即知道将“ default”替换为string.Empty吗?
Dscoduc

+1和答案:刚刚测试过并运行完美...谢谢!
Dscoduc

请注意,如果进行调用的方法多次运行并且attribs被重用,则您可能会覆盖在一次调用中获得的有效数据,并在后续调用中覆盖“默认”。
xcud

@xcud:是的。在这种情况下,他应该使用以下代码:attribs.something =(entry.Properties [“ something”]。Value?(objcet)attribs.something).ToString();
配置器

42

如果您以.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();

美丽。我正面临着从1.1到4.0的转换,而在1.1中,null.ToString()实际上返回了“”,因此我现在有数千次出现来检查null安全性。如果我能解决这个问题,那么过渡会更加顺畅!
Nicolas78

哇,这样做曾经为我节省了大量时间!谢谢!
布拉德(Brad)

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

40-Love-不,如果value为null,则返回null而不是空字符串。
克里斯·孔雀

@ChrisPeacock否,请检查文档:Convert.ToString(对象值)的返回值是“'value'的值的String表示形式,如果value为null,则返回String.Empty”。快速检查实际程序可以确认这一点。
罗布·吉利姆

3

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

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

如果entry.Properties["something"].Valuenull,这个悄然返回一个空string

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

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

这比怪异的Convert.ToString调用更简洁。
thepaulpage

@thepaulpage有一个在C#6更好的方法
谢尔盖Kalinichenko

2

你不能做:

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

不,你不能;如果为“ null”,则将得到null引用错误。
乔治·斯托克

1
之所以有效,是因为如果value为null,它将返回null字符串,并且不会引发异常。
现场直播

2
这不适用于值类型。'字符串str = myFloat作为字符串;' 失败。您将收到以下编译器错误。无法通过引用转换,装箱转换,拆箱转换,包装转换或空类型转换将类型“ float”转换为“字符串”
CleanCoder 2012年

1
不,如果类型不是字符串,则始终返回null !!!这是演员,而不是转换!并且将无法使用表单值类型!
沙旺2012年

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

虽然不确定性能...


2

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

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

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


1

作为RexM答案的一种变体:

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

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


1

要精确地执行您尝试执行的辅助方法,可以始终使用:

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

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

您是否不必在CopyIfNotNull的第二个参数中指定“ out”?
Dscoduc

对。我发贴后才意识到。
Mike Hall,

1

是否可以执行类似 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;
    }
}

2
当然,因为实例方法比扩展方法具有更高的优先级
codymanix 2011年

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.