Почему эти два сравнения имеют разные результаты?
почему этот код возвращает 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и сравнение двух экземпляров с==оператора. Код не будет компилироваться, если вы не предоставите свою собственную реализацию==для этих типов.
