gpt4 book ai didi

c# - 泛型方法中的运算符重载

转载 作者:太空狗 更新时间:2023-10-29 20:49:54 31 4
gpt4 key购买 nike

此代码片段来自C# in Depth

    static bool AreReferencesEqual<T>(T first, T second)
where T : class
{
return first == second;
}

static void Main()
{
string name = "Jon";
string intro1 = "My name is " + name;
string intro2 = "My name is " + name;
Console.WriteLine(intro1 == intro2);
Console.WriteLine(AreReferencesEqual(intro1, intro2));
}

以上代码片段的输出是

True 
False

当main方法改为

    static void Main()
{
string intro1 = "My name is Jon";
string intro2 = "My name is Jon";
Console.WriteLine(intro1 == intro2);
Console.WriteLine(AreReferencesEqual(intro1, intro2));
}

以上代码片段的输出是

True 
True

我不明白为什么?

编辑:一旦你理解了字符串实习,下面的问题就不适用了。

<罢工>通用方法如何接收参数 AreReferencesEqual在第二个代码片段中?

<罢工>

string 类型在连接时有什么变化使得 == 运算符不调用 String 类型的重载 Equals 方法?

最佳答案

对于字符串,您可能不打算使用引用相等性。要在泛型方法中访问平等和不平等,最好的办法是:

EqualityComparer<T>.Default.Equals(x,y); // for equality
Comparer<T>.Default.Compare(x,y); // for inequality

static bool AreValuesEqual<T>(T first, T second)
where T : class
{
return EqualityComparer<T>.Default.Equals(first,second);
}

这仍然使用重载的 Equals ,但也处理空值等。对于不等式,这处理空值,并且 IComparable<T>IComparable .

对于其他运算符,请参阅 MiscUtil .


回复问题;在这种情况下:

    string intro1 = "My name is Jon";
string intro2 = "My name is Jon";
Console.WriteLine(intro1 == intro2);
Console.WriteLine(AreReferencesEqual(intro1, intro2));

你得到 true , true因为编译器和运行时被设计为高效处理字符串;您使用的任何文字都是“内部”的,并且每次在您的 AppDomain 中都使用相同的实例。如果可能,编译器(而不是运行时)也会执行连接 - 即

    string intro1 = "My name is " + "Jon";
string intro2 = "My name is " + "Jon";
Console.WriteLine(intro1 == intro2);
Console.WriteLine(AreReferencesEqual(intro1, intro2));

与前面的示例完全相同的代码。完全没有区别。但是,如果您强制它在运行时连接字符串,它会假定它们很可能是短暂的,因此它们不会被保留/重新使用。所以在这种情况下:

    string name = "Jon";
string intro1 = "My name is " + name;
string intro2 = "My name is " + name;
Console.WriteLine(intro1 == intro2);
Console.WriteLine(AreReferencesEqual(intro1, intro2));

你有 4 个字符串; “乔恩”(实习生)、“我的名字是”(实习生),以及“我的名字是乔恩”的两个不同实例。因此 ==返回 true,引用相等返回 false。但是值相等 ( EqualityComparer<T>.Default ) 仍会返回 true。

关于c# - 泛型方法中的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1061627/

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