gpt4 book ai didi

c# - 字符串 == 重载运算符是否实际用于某些通用比较方法?

转载 作者:太空宇宙 更新时间:2023-11-03 18:29:17 26 4
gpt4 key购买 nike

我目前正在阅读 Jon Skeet 的 C# 深度,第 2 版。我想引用 list 3.5:

static bool AreReferencesEqual<T>(T first, T second) where T : class
{
return first == second;
}
...
string name = "John";
string intro1 = "My name is " + name;
string intro2 = "My name is " + name;
Console.WriteLine(intro1 == intro2);
Console.WriteLine(AreReferencesEqual(intro1, intro2);

作者写道,第一次比较的输出应该是True,第二次比较的输出应该是False,因为泛型方法中没有使用重载运算符。当然,他对输出的看法是正确的。

现在让我们稍微更改一下代码片段:

static bool AreReferencesEqual<T>(T first, T second) where T : class
{
return first == second;
}
...
string intro1 = "John";
string intro2 = "John";
Console.WriteLine(intro1 == intro2);
Console.WriteLine(AreReferencesEqual(intro1, intro2);

现在两种比较方法都返回 True。让我们再次调整代码,因为这可能与之前我们比较使用已经存在的 string 创建的变量这一事实有关。

static bool AreReferencesEqual<T>(T first, T second) where T : class
{
return first == second;
}
...
string name = "John"
string intro1 = name;
string intro2 = name;
Console.WriteLine(intro1 == intro2);
Console.WriteLine(AreReferencesEqual(intro1, intro2);

两种情况下的输出都是True

谁能澄清这种行为的原因是什么?例一和例三真的有这么大的区别吗?

最佳答案

是的,有很大的不同。

在示例 1 中,intro1intro2 指的是不同的对象。在例子中2 和 3,intro1intro2 具有相同的值 - 它们引用相同的对象,因此如果您调用 Object.ReferenceEquals(intro1, intro2) 将返回 true。

该行为的原因是编译器必须在编译时计算出 ==AreReferencesEqual 中的含义,而不知道 T 的值。它无法判断您将使用 string 类型参数调用它,因此它不知道 == 的重载。这与您无法在 AreReferencesEqual 中调用任何其他特定于字符串的成员的原因基本相同。

关于c# - 字符串 == 重载运算符是否实际用于某些通用比较方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26045262/

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