Почему эти два сравнения имеют разные результаты?
почему этот код возвращает true:
new Byte() == new Byte() // returns true
но этот код возвращает значение false:
new Byte[0] == new Byte[0] // returns false
4 ответа:
, потому что
new Byte()
создает тип значения, которые сравниваются по значению (по умолчанию он будет возвращатьbyte
со значением0
). Иnew Byte[0]
создает массив, который является ссылочным типом и сравнивается по ссылке (и эти два экземпляра массива будут иметь разные ссылки).посмотреть типы значений и ссылочные типы статьи для деталей.
байт типы значений в .Чистая, т. е.
==
оператор возвращает true тогда и только тогда, когда два байта имеют одинаковое значение. Это также известно как равенство значений.но массивы ссылка типа в .NET, что означает
==
оператор возвращает true тогда и только тогда, когда они ссылаются на один и тот же экземпляр массива в памяти. Это также известно как равенство ссылок или личность.отметим, что
==
оператор может быть перегружен для обоих типов ссылок и значений.System.String
, например, является ссылочным типом, но==
оператор для строк сравнивает каждый символ в массив в последовательности. Смотрите рекомендации по перегрузке Equals () и Operator = = (руководство по программированию на C#).если вы хотите проверить, является ли массивы содержат точно такие же значения (по порядку) вы должны рассмотрите возможность использования
Enumerable.SequenceEqual
вместо==
.
сравнение ссылки на самом деле сравнение адреса указателя, которые отличаются, что является причиной возврата false и в значение адреса не имеет значения он сравнивает значение.
компилятор пытается сохранить тип значения в регистрах, но из-за ограниченного числа регистров дальнейшее хранение происходит в стеке со значениями [ссылка] в то время как тип ссылки находится в стеке, но значение, содержащее адрес адреса памяти в куче.
сравнение здесь сравните значение, присутствующее в стек, который в первом случае для обоих одинаков, а во втором случае это адреса кучи, которые различны.
есть перегрузка
==
оператор в которых оба операнда имеют типbyte
и он реализован для сравнения значения каждого байта; в этом случае у вас есть два нулевых байта, и они равны.The
==
оператор не перегружен для массивов, поэтому перегрузка имеет дваobject
используются операнды (так как массивы имеют типobject
) во втором случае, и его реализация сравнивает ссылки на объекты. Ссылка на два массива различаться.стоит отметить, что это не имеет ничего (непосредственно) общего с тем, что
byte
- Это тип значения, а массивы-ссылочные типы. Элемент==
оператораbyte
имеет семантику значения только потому что существует определенная перегрузка оператора с этой реализацией. Если бы эта перегрузка не существовала, то было бы быть нет перегрузки, для которой два байта были бы допустимыми операндами, и как таковой код не будет компилироваться вообще. Вы можете увидеть это достаточно легко, создав пользовательскийstruct
и сравнение двух экземпляров с==
оператора. Код не будет компилироваться, если вы не предоставите свою собственную реализацию==
для этих типов.