这可能已经被问到了。我搜索了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
}
答案 0 :(得分:2)
为什么它应该抛出异常?
当您尝试执行任何操作时,它会抛出异常,意味着调用该变量value
的任何成员。
if (value != "x")
基本上你只是将它的值(null)与x
进行比较,它不会抛出任何异常。
答案 1 :(得分:2)
Equality
和Inequality
运算符因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对象上的方法。