为什么这两个比较有不同的结果?

FSo*_*ou1 68 .net c# equality

为什么这段代码返回true:

new Byte() == new Byte()   // returns true
Run Code Online (Sandbox Code Playgroud)

但是这段代码返回false:

new Byte[0] == new Byte[0] // returns false
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 143

因为new Byte()创建值类型,它们按值进行比较(默认情况下它将返回byte0).并new Byte[0]创建数组,这是一个引用类型并通过引用进行比较(这两个数组实例将有不同的引用).

有关详细信息,请参阅值类型和参考类型一


p.s*_*w.g 43

字节是.NET 中的值类型,这意味着==当且仅当两个字节具有相同值时,运算符才返回true.这也称为价值平等.

但是数组是.NET 中的引用类型,这意味着==当且仅当它们在内存中引用相同的数组实例时,运算符才返回true.这也称为引用相等身份.

请注意,==可以为参考和值类型重载运算符.System.String例如,是一个引用类型,但==字符串的运算符按顺序比较数组中的每个字符.请参阅重载等于()和运算符指南==(C#编程指南).

如果要测试数组是否包含完全相同的值(按顺序),则应考虑使用Enumerable.SequenceEqual而不是==.


Zah*_*med 10

比较引用实际上是比较指针地址,这是不同的,这是返回false的原因和值地址无关紧要比较值.

编译器尝试将值类型存储在寄存器中,但由于寄存器数量有限,堆栈中的进一步存储会发生值[参考],而引用类型在堆栈中,但值保存堆中的内存地址.

这里的比较比较了堆栈中存在的值,在第一种情况下,两者都是相同的,而在第二种情况下,它是不同的堆的地址.

参考

  • 这是一个非常令人困惑的答案.第一部分仍然使它看起来像参考比较,因为你仍然使用"指针"这个词.使用图形与文本也很烦人,因为它使我很难编辑它来改进答案. (5认同)
  • 你的整个答案仍然是漫无边际的.值类型的关键方面是它们按值进行比较.**存储该值的位置无关紧要.您可以将两种值类型放入堆分配的结构中(故意或由于提升),并且比较仍将基于它们的值. (5认同)