C# C语言中的字符串相等问题#
这是C代码 结果是C# C语言中的字符串相等问题#,c#,string,reference,equals,C#,String,Reference,Equals,这是C代码 结果是 str1 == str3 String.Equals(str1, str3) str1 == str4 String.Equals(str1, str4) str3 == str4 String.Equals(str3, str4) 为什么所有的结果都说“相等”?? 正如我所知道的,参考值是不同的。 所以,结果应该是“不同的!”。但不是。 为什么? 似乎没有理由使用String.equal() 字符串的相等性已被重写为基于其值 String.Equals的文档说
str1 == str3
String.Equals(str1, str3)
str1 == str4
String.Equals(str1, str4)
str3 == str4
String.Equals(str3, str4)
为什么所有的结果都说“相等”??
正如我所知道的,参考值是不同的。
所以,结果应该是“不同的!”。但不是。
为什么?
似乎没有理由使用String.equal() 字符串的相等性已被重写为基于其值
String.Equals
的文档说明它检查值,但由于String
的实现,=
也会检查值
引用类型的默认相等性基于引用本身,但这很容易被重写。。。因此,基本上您的断言是有缺陷的,因为它没有考虑覆盖默认行为的类型
As,可以通过对象.ReferenceEquals
静态方法强制引用相等,但是As,如果字符串已被插入,这也可能失败
根据ILSpy的说法,
String.Equals
无论如何都会使用=
:
public static bool Equals(string a, string b)
{
return a == b || (a != null && b != null && a.Length == b.Length && string.EqualsHelper(a, b));
}
字符串的相等性已被重写为基于其值
String.Equals
的文档说明它检查值,但由于String
的实现,=
也会检查值
引用类型的默认相等性基于引用本身,但这很容易被重写。。。因此,基本上您的断言是有缺陷的,因为它没有考虑覆盖默认行为的类型
As,可以通过对象.ReferenceEquals
静态方法强制引用相等,但是As,如果字符串已被插入,这也可能失败
根据ILSpy的说法,
String.Equals
无论如何都会使用=
:
public static bool Equals(string a, string b)
{
return a == b || (a != null && b != null && a.Length == b.Length && string.EqualsHelper(a, b));
}
这意味着您的输出完全正常。
==
已重载String
以作为值而不是引用来计算相等性。发件人:
尽管string是一种引用类型,但是定义了相等运算符(=
和!=
)来比较string
对象的值,而不是引用
但是,您需要注意的是,一些字符串将在编译时进行计算,编译器将对它们进行处理(即,使用给定值保存对字符串的单个引用)。因此,这些字符串作为引用也可能相等(但不能保证是这样)。
==
已重载字符串
以将相等作为值而不是引用进行评估。发件人:
尽管string是一种引用类型,但是定义了相等运算符(=
和!=
)来比较string
对象的值,而不是引用
但是,您需要注意的是,一些字符串将在编译时进行计算,编译器将对它们进行处理(即,使用给定值保存对字符串的单个引用)。因此,这些字符串作为引用也可能相等(但不能保证这种情况)。对于比较字符串,您应该使用:
var1string.CompareTo(var2string) == 0
这是比较字符串的正确方法
因此,改变:
if (str1 == str2)
为此:
if (str1.CompareTo(str2) == 0)
其他的也一样。要比较字符串,您应该使用:
var1string.CompareTo(var2string) == 0
这是比较字符串的正确方法
因此,改变:
if (str1 == str2)
为此:
if (str1.CompareTo(str2) == 0)
其他的也一样。你把它弄糊涂了
string.Equals
重写(与ReferenceEquals
具有相同的语义)并通过比较字符串的值来工作。这就是为什么object.Equals
首先是virtual
。让您感到困惑的原因
string.Equals
重写(与ReferenceEquals
具有相同的语义)并通过比较字符串的值来工作。这就是为什么object.Equals
首先是virtual
。每个字符串文本不一定会产生新的字符串实例。当两个或多个根据字符串相等运算符相等的字符串文字出现在同一程序集中时,这些字符串文字引用同一个字符串实例。例如,由
class Test
{
static void Main() {
object a = "hello";
object b = "hello";
System.Console.WriteLine(a == b);
}
}
为True,因为这两个文本引用同一个字符串实例
您完全可以看到这一点:
每个字符串文本不一定会产生新的字符串实例。当两个或多个根据字符串相等运算符相等的字符串文字出现在同一程序集中时,这些字符串文字引用同一个字符串实例。例如,由
class Test
{
static void Main() {
object a = "hello";
object b = "hello";
System.Console.WriteLine(a == b);
}
}
为True,因为这两个文本引用同一个字符串实例
您完全可以看到这一点:
实际上,谈论
System.String
是没有理由的。如果你想通过引用来比较任何对象,请使用object.referenceequals哇,你是对的。。我理解哇……事实上,谈论System.String
是没有理由的。如果你想通过引用来比较任何对象,请使用object.referenceequals哇,你是对的。。我理解哇..它们可能或许多引用不相等,但这不是=
返回true的原因。它们可能或许多引用不相等,但这不是=
返回true的原因。谢谢Jon,我知道new konowledge~谢谢Jon,我知道new konowledge~为什么这比使用==?==运算符比较字符串的值,它在代码中的可读性要高得多