C# 当我期望它是真的时,为什么它是假的?
第一行是真的,第二行是假的。htmlOut和s2是StringWriter对象C# 当我期望它是真的时,为什么它是假的?,c#,.net,C#,.net,第一行是真的,第二行是假的。htmlOut和s2是StringWriter对象 bool b = s2.ToString() == htmlOut.ToString(); ret = htmlOut.Equals(s2); 我期望b为true,但为什么ret为false?Equals的默认实现支持引用类型的引用相等,以及值类型的位相等。htmlOut类型是否具有非默认重写的Equals方法 在本例中,它似乎不是,它告诉您它们是不同的实例,不管它们的语义值是否匹配。String
bool b = s2.ToString() == htmlOut.ToString();
ret = htmlOut.Equals(s2);
我期望b为true,但为什么ret为false?Equals的默认实现支持引用类型的引用相等,以及值类型的位相等。htmlOut类型是否具有非默认重写的Equals方法
在本例中,它似乎不是,它告诉您它们是不同的实例,不管它们的语义值是否匹配。
StringWriter
使用内部StringBuilder
进行写入StringWriter.ToString()
返回由StringBuilder
生成的字符串
StringWriter
不重写object.Equals()
因此StringWriter.Equals()
比较两个对象是否是相同的引用,而不是它们的字符串表示是否相等
htmlOut.ToString().Equals(s2.ToString());
这将返回trueStringWriter不重写object.Equals
htmlOut.Equals(s2);
相当于:
object.ReferenceEquals(htmlOut, s2);
因此,对于StringWriter.Equals与==?
StringWriter
没有实现默认为引用相等的=
运算符,因此是的。不完全是这样<代码>htmlOut.Equals(s2)如果htmlOut
是null
而对象时,code>将抛出NullReferenceException
,ReferenceEquals(htmlOut,s2)代码>将不显示。