如果操作符被糟糕地重载了,那么这两个调用可能不会相同。或者有一个重载,并且它的写法是不对称比较操作数,或者这两个语句调用不同的重载。
但是假设已经正确地重载了操作符,那么这应该是绝对没问题的。当然,前提是你想调用重载的操作符。在你不想调用它的情况下,我会使用ReferenceEquals
来清晰地表明。
我个人推荐使用if (a == null)
的方式,因为我发现它更易于阅读(我相信许多人也是如此)。而“尤达”风格的if (null == a)
有时被C程序员使用,他们担心打错字,其中if (a = null)
将是一种赋值和有效的语句...虽然在良好的C编译器中会有警告。
以下是一个实现不好的重载示例,其中操作数的顺序很重要,因为null
可以转换为string
和Test
:
using System;
class Test
{
public static bool operator ==(Test t, string x)
{
Console.WriteLine("Test == string");
return false;
}
public static bool operator !=(Test t, string x)
{
Console.WriteLine("Test != string");
return false;
}
public static bool operator ==(string x, Test t)
{
Console.WriteLine("string == Test");
return false;
}
public static bool operator !=(string x, Test t)
{
Console.WriteLine("string != Test");
return false;
}
static void Main(string[] args)
{
Test t = null;
Console.WriteLine(t == null);
Console.WriteLine(null == t);
}
}
现在我们看到问题已经更新,所以不是那种情况...但是实现可能仍然很差。例如,它可以写成:
public static bool operator == (UnityEngine.Object x, UnityEngine.Object y)
{
// Awful implementation - do not use!
return x.Equals(y);
}
在这种情况下,如果
x
为null,则会出现
NullReferenceException
错误,但如果
x
不为null但
y
为null(假设
Equals
已正确编写),则会成功。尽管如此,我仍然期望操作符已经被正确编写,这不应该是一个问题。
ReferenceEquals
而不是转换。我没有注意到你更新的那部分 - 请尽可能从一开始就问清楚所有问题。如果一个问题发展得很快,回答者很难跟上,导致页面混乱。 - Jon Skeet