gpt4 book ai didi

c# - StringBuilder 和字符串相等性检查

转载 作者:可可西里 更新时间:2023-11-01 07:44:01 26 4
gpt4 key购买 nike

System.Console.WriteLine(s == t); 返回 false 时,我正在尝试此代码示例和 OpTest。有人可以解释一下吗?

public static void OpTest<T>(T s, T t) where T : class 
{
System.Console.WriteLine(s == t);
}
static void Main()
{
string s1 = "строка";
System.Text.StringBuilder sb = new System.Text.StringBuilder(s1);
System.Console.Write(sb);
string s2 = sb.ToString();
OpTest<string>(s1, s2);
}

最佳答案

您的通用方法基本上将执行引用 相等性检查 - s1s2 的值引用不同但相等的字符串。您可以像这样更轻松地显示它:

string x = "test";
string y = new string(x.ToCharArray());
Console.WriteLine(x == y); // Use string overload, checks for equality, result = true
Console.WriteLine(x.Equals(y)); // Use overridden Equals method, result = true
Console.WriteLine(ReferenceEquals(x, y)); // False because they're different objects
Console.WriteLine((object) x == (object) y); // Reference comparison again - result = false

请注意,您在 OpTest 中的约束不会更改使用哪个 == 运算符。这是在编译时根据 T 上的约束确定的。请注意,运算符永远不会被覆盖,只会被重载。这意味着在编译时选择实现,而不考虑执行时的类型。

如果您限制 T 派生自重载 == 运算符的某种类型,则编译器将使用该重载。例如:

using System;

class SillyClass
{
public static string operator ==(SillyClass x, SillyClass y) => "equal";
public static string operator !=(SillyClass x, SillyClass y) => "not equal";
}

class SillySubclass : SillyClass
{
public static string operator ==(SillySubclass x, SillySubclass y) => "sillier";
public static string operator !=(SillySubclass x, SillySubclass y) => "very silly";
}

class Test
{
static void Main()
{
var x = new SillySubclass();
var y = new SillySubclass();
OpTest(x, y);
}

static void OpTest<T>(T x, T y) where T : SillyClass
{
Console.WriteLine(x == y);
Console.WriteLine(x != y);
}
}

此处 OpTest 方法确实使用了重载运算符 - 但只使用来自 SillyClass 的运算符,而不是 SillySubclass.

关于c# - StringBuilder 和字符串相等性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44964799/

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