gpt4 book ai didi

c# - object.ReferenceEquals 或 == 运算符?

转载 作者:太空狗 更新时间:2023-10-29 20:51:59 26 4
gpt4 key购买 nike

为什么 ThrowIfNull 实现为:

    static void ThrowIfNull<T>(this T argument, string name) where T : class
{
if (argument == null)
{
throw new ArgumentNullException(name);
}
}

重写为:

不是更好吗?
    static void ThrowIfNull<T>(this T argument, string name) where T : class
{
if (object.ReferenceEquals(argument, null))
{
throw new ArgumentNullException(name);
}
}

优点:它有助于避免混淆 Equals 重载,并可能使代码更清晰。

这有什么缺点吗?应该有一些。

最佳答案

两者没有区别。您混淆了覆盖 Equals(这两个实现中都没有调用)与重载 ==(这由于在编译时执行重载,并且编译器对 T 的了解不足,因此无法使用任何特定的重载)。

只是为了说明我的意思:

static void ThrowIfFoo<T>(this T argument, string name) where T : class
{
if (argument == "foo")
{
throw new Exception("You passed in foo!");
}
}

测试:

"foo".ThrowIfFoo(); // Throws

string x = "f";
x += "oo"; // Ensure it's actually a different reference

x.ThrowIfFoo(); // Doesn't throw

ThrowIfFoo 不知道 T 将是一个字符串 - 因为这取决于 调用 代码 - 并且重载决议只是在编译 ThrowIfFoo 时执行。因此它使用运算符 ==(object, object) 而不是 ==(string, string)

换句话说,它是这样的:

object foo1 = "foo";

string tmp = "f";
object foo2 = tmp + "oo";

Console.WriteLine(foo1.Equals(foo2)); // Prints True
Console.WriteLine(foo1 == foo2); // Prints false
Console.WriteLine((string) foo1 == (string) foo2); // Prints True

在最后一行,编译器知道它可以使用 == 的重载,因为两个操作数都有 编译时 类型的 string

关于c# - object.ReferenceEquals 或 == 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7119594/

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