Почему эти два сравнения имеют разные результаты?


почему этот код возвращает true:

new Byte() == new Byte()   // returns true

но этот код возвращает значение false:

new Byte[0] == new Byte[0] // returns false
4 69

4 ответа:

, потому что new Byte() создает тип значения, которые сравниваются по значению (по умолчанию он будет возвращать byte со значением 0). И new Byte[0] создает массив, который является ссылочным типом и сравнивается по ссылке (и эти два экземпляра массива будут иметь разные ссылки).

посмотреть типы значений и ссылочные типы статьи для деталей.

байт типы значений в .Чистая, т. е. == оператор возвращает true тогда и только тогда, когда два байта имеют одинаковое значение. Это также известно как равенство значений.

но массивы ссылка типа в .NET, что означает == оператор возвращает true тогда и только тогда, когда они ссылаются на один и тот же экземпляр массива в памяти. Это также известно как равенство ссылок или личность.

отметим, что == оператор может быть перегружен для обоих типов ссылок и значений. System.String, например, является ссылочным типом, но == оператор для строк сравнивает каждый символ в массив в последовательности. Смотрите рекомендации по перегрузке Equals () и Operator = = (руководство по программированию на C#).

если вы хотите проверить, является ли массивы содержат точно такие же значения (по порядку) вы должны рассмотрите возможность использования Enumerable.SequenceEqual вместо ==.

сравнение ссылки на самом деле сравнение адреса указателя, которые отличаются, что является причиной возврата false и в значение адреса не имеет значения он сравнивает значение.

компилятор пытается сохранить тип значения в регистрах, но из-за ограниченного числа регистров дальнейшее хранение происходит в стеке со значениями [ссылка] в то время как тип ссылки находится в стеке, но значение, содержащее адрес адреса памяти в куче.

сравнение здесь сравните значение, присутствующее в стек, который в первом случае для обоих одинаков, а во втором случае это адреса кучи, которые различны.

reference

есть перегрузка == оператор в которых оба операнда имеют тип byte и он реализован для сравнения значения каждого байта; в этом случае у вас есть два нулевых байта, и они равны.

The == оператор не перегружен для массивов, поэтому перегрузка имеет два object используются операнды (так как массивы имеют тип object) во втором случае, и его реализация сравнивает ссылки на объекты. Ссылка на два массива различаться.

стоит отметить, что это не имеет ничего (непосредственно) общего с тем, что byte - Это тип значения, а массивы-ссылочные типы. Элемент == оператора byte имеет семантику значения только потому что существует определенная перегрузка оператора с этой реализацией. Если бы эта перегрузка не существовала, то было бы быть нет перегрузки, для которой два байта были бы допустимыми операндами, и как таковой код не будет компилироваться вообще. Вы можете увидеть это достаточно легко, создав пользовательский struct и сравнение двух экземпляров с ==оператора. Код не будет компилироваться, если вы не предоставите свою собственную реализацию == для этих типов.