好吧,如果操作员严重过载,这两个调用可能会不一样。可能存在一个重载,并且可以以不对称比较操作数的方式编写,或者两个语句可以调用不同的重载。
但假设它已经适当地重载,那应该是绝对没问题的。当然,如果你想要调用重载的操作符的话。在你不知道的情况下,我会使用ReferenceEquals 说明这一点。
我个人会推荐if (a == null) 方法,因为我发现它更容易阅读(我相信许多其他人也是如此)。 if (null == a) 的“yoda”风格有时被害怕拼写错误的 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 为空时,它将失败并返回NullReferenceException,但如果x 为非空但y 为空(假设Equals 已正确写入)则成功。
不过,我希望运算符写得正确,这不是问题。