gpt4 book ai didi

c# - 操作数的顺序对于 C# 中的重载 == 运算符是否重要

转载 作者:行者123 更新时间:2023-11-30 14:09:31 24 4
gpt4 key购买 nike

我正在使用第 3 方工具 (Unity3d),其中一个基本基类重载了 == 运算符 (UnityEngine.Object)。

重载运算符的签名是:

public static bool operator == (UnityEngine.Object x, UnityEngine.Object y)

进行比较的顺序是否会影响是否使用此重载运算符?

为了说明,这两个都应该使用重载运算符并返回相同的结果吗?

// initialize with some value
UnityEngine.Object a = ....

Debug.Log(a == null);
Debug.Log(null == a);

我问的原因是因为我想(有时)避免这种过载行为(使用默认的 == 运算符),并且想知道翻转订单是否有助于实现这一点?

(可能还有另一种选择 - 将操作数转换为 System.object,但我不能 100% 确定它是否有效)。

最佳答案

好吧,如果运算符严重重载,这两个调用可能会不一样。要么可能有一个重载,并且可以以一种不对称比较操作数的方式编写,要么这两个语句可以调用不同的重载。

但假设它已正确地 重载,那绝对没问题。当然,如果您想要 调用重载运算符,那就是这样。在您不这样做的情况下,我会使用 ReferenceEquals 明确说明.

我个人会推荐 if (a == null) 方法,因为我发现它更容易阅读(我相信很多其他人也这样做)。 if (null == a) 的“yoda”风格有时被害怕拼写错误的 C 程序员使用,其中 if (a = null) 将是一个赋值和一个有效语句...尽管在体面的 C 编译器中带有警告。

这是一组糟糕实现的重载示例,其中操作数顺序很重要,因为 null 可转换为 string测试:

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 为非空但 >y 为 null(假设 Equals 已正确编写)。

不过,我期望运算符已正确编写,这不是问题。

关于c# - 操作数的顺序对于 C# 中的重载 == 运算符是否重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28936446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com