在C#中,一个字符串的值为NULL是否等同于另一个字符串的值为NULL?

5
在我的VS 2015编译器上进行测试,我发现:
    static void Main(string[] args)
    {
        string str1 = null;
        string str2 = null;
        if(str1==str2)  //they are the same on my machine
        {
        }
    }

但这是一种已记录的行为吗?根据定义,NULL 是未定义的行为,因此将 NULL 与另一个 NULL 进行比较可能是未定义的。在我的计算机上,使用我当前的 .Net 框架,两个 NULL 可能会变成相同的。但在未来,它们可能不再相同。在这种情况下,我的代码将默默地出错。
是否安全始终假定上述两个 NULL 字符串始终相同?

null 只是表示它不指向任何引用。因此,null 将始终为 null。除非您自己更改它,否则它不会改变。 - slow
5
奇怪的问题。 - user10058046
3
在托管环境中,我认为 null 不是未定义行为。 - thehennyy
6
NULL 没有一个普遍适用的意义。仅因为在某些语言中(例如SQL,因为我看到您以前曾在这里做过一些mysql的工作),NULL 的含义与“未知”或“未定义”的行为密切相关,这并不意味着C#中的 null 也是如此。 - Damien_The_Unbeliever
1
在C#和.NET中,null具有明确定义的含义,并且不表示“未定义行为”。 - Lasse V. Karlsen
1
@JᴀʏMᴇᴇ:为什么这很奇怪?如果您的应用程序依赖于它,您必须知道它是否是您可以依赖的东西,或者在某些情况下或在未来的.NET框架版本中可能会出现问题。顺便说一句,即使对于VB.NET,Nothing也真正意味着未指定/未定义(或默认值)。 - Tim Schmelter
2个回答

14

是的,这在这里有记录。

如果a和b均为null,则此方法返回true。

当使用==时,会使用此方法,详情请参见此处

调用静态的Equals(String, String)方法


1
@MickyD,再加10个赞。我需要用完今天的点赞次数。 - TheGeneral
好的好的...11. 我很喜欢静态的 Equals。最近才发现它 ;) - user585968
1
@MickyD:我喜欢静态的Equals,因为它有这个重载,可以以不区分大小写的方式进行比较(与==相反),并且避免了可能发生的实例方法的NullReferenceException - Tim Schmelter
同意,先生。 (比“string.Compare(...)”更简洁) - user585968

2
如果两个字符串都为null,则该方法始终返回true,因为==用于引用比较。简单来说,==检查两个对象是否指向同一内存位置。
我尝试了Java中的示例str1.Equals(str2),但这会导致空指针异常,因为.Equals评估对象中的值比较。
希望这能帮到您。

1
运算符重载意味着您不能假设==始终是引用比较。String是一个重载它的类(请参见https://msdn.microsoft.com/en-us/library/system.string.op_equality(v=vs.110).aspx)。 - Damien_The_Unbeliever
你遇到了一个 NullPointerException,因为你试图访问一个 null 对象的 .Equals 方法,而不是因为你比较了值。尝试使用 string.Equals(str1, str2),你会得到 true - Rafalon
还有,这是一个 NullReferenceException,而不是 NullPointerException - Rafalon
抱歉,srt1.Equals(str2) 的重点在于 Java 上下文中,在 Java 中它会返回 NullPointerException。我引用这个例子只是为了让大家更清楚地理解。然而,在 C# 中,string.Equals(str1, str2) 返回 true,因为它基于内容检查相等性。 - Safwan Shaikh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接