为何new byte()相等比较返回true而new byte[0]比较返回false
两个表达式结果差异的根本原因
首先给出可复现问题的代码片段:
var result1 = new byte() == new byte(); // true var result2 = new byte[0] == new byte[0]; // false
两类表达式的判断逻辑完全不同,差异本质来自.NET的值类型、引用类型的默认==运算符规则不同:
1. new byte() == new byte()返回true的原因
byte属于.NET中的值类型,值类型的默认==运算符执行按值比较逻辑,只校验两个实例的存储值是否相等,不会关联内存地址判断。new byte()会创建一个值为默认值0的byte值类型实例,两个实例的存储值都是0,比较结果自然为true。
补充:值类型实例默认分配在栈上,不存在堆内存引用的概念,所有未自定义运算符重载的值类型,==默认都走值比较逻辑。
2. new byte[0] == new byte[0]返回false的原因
- 所有数组类型都属于.NET中的引用类型,引用类型的默认
==运算符执行引用同一性比较逻辑,只会校验两个实例是否指向托管堆上的同一块内存地址,不会校验实例内部存储的内容。 - 每执行一次
new byte[0]都会在托管堆上分配一块新的内存空间存储空数组实例,两次new操作得到的是两个完全独立的实例,内存地址不同,因此引用比较结果为false。
补充:如果你需要比较两个数组的内容是否一致,可以使用Enumerable.SequenceEqual()方法,例如new byte[0].SequenceEqual(new byte[0])会返回true。
内容的提问来源于stack exchange,提问作者Polina Ivanchik
相关产品推荐
相关产品推荐

