测试空字符串不会抛出NullReferenceException

时间:2014-04-02 19:13:00

标签: c# string nullreferenceexception

这可能已经被问到了。我搜索了SO并在Null VS String.Empty上找到了几个问题,但我很好奇为什么以下语句不会抛出NullReferenceException:

String value = null;

if (value != "x") { // does not throw Exception here

    String test = value.Trim(); // throw Exception here as expected

}

4 个答案:

答案 0 :(得分:2)

为什么它应该抛出异常?

当您尝试执行任何操作时,它会抛出异常,意味着调用该变量value的任何成员。

if (value != "x")

基本上你只是将它的值(null)与x进行比较,它不会抛出任何异常。

答案 1 :(得分:2)

EqualityInequality运算符因strings而超载。所以当你这样做时:

value != "x"

调用System.String::op_Inequality调用String.Equals方法:

public static bool operator != (String a, String b) 
{
    return !String.Equals(a, b);
}

String.Equals的实现方式如下:

public static bool Equals(String a, String b)
{
    if ((Object)a == (Object)b)
    {
        return true;
    }

    if ((Object)a == null || (Object)b == null)
    {
        return false;
    }
    if (a.Length != b.Length)
            return false;

    return EqualsHelper(a, b);
}

正如您所看到的,它会将strings转换为object并返回false,如果其中一个等于null。我认为您对为何进行比较感到困惑{ {1}}不会返回string,因为它们会通过值进行比较而不是引用,因此我会分享一些细节。但通常将null对象与不会抛出null的内容进行比较。如果您尝试在NullReferenceException对象上调用方法,则仅抛出该异常。

答案 2 :(得分:0)

因为在这种情况下你正在测试null和“x”是否不同,这是一个有效的操作(显然结果是真的)。​​

在第二步中,您尝试在未定义的对象上调用方法,因此引发异常。

答案 3 :(得分:0)

将您的代码与:

进行比较
if (value != null)
{
    ...
}

这显然适用于value为null或非null(" x",比如说)。后一种情况的比较变为

if ("x" != null)

或等效

if (null != "x")

相当于您原来的

测试
if (value != "x")

其中value为空。

比较null和非null值(当然总是false)。但是,您无法像在示例中那样调用null对象上的方法。