[#] О сравнении объектов по значению — 5: Structure Equality Problematic
habrabot(difrex,1) — All
2017-01-08 15:30:03


#### В [предыдущей публикации][1] мы вывели наиболее полный и корректный способ реализации сравнения по значению объектов — экземпляров [классов][2] (являющихся [ссылочными типами — Reference Types][3]) для платформы [.NET][4]. {#v-predyduschey-publikaciihttpshabrahabrrupost315258-my-vyveli-naibolee-polnyy-i-korrektnyy-sposob-realizacii-sravneniya-po-znacheniyu-obektov---ekzemplyarov-klassovhttpsmsdnmicrosoftcomlibrary0b0thcktaspx-yavlyayuschihsya-ssylochnymi-tipami---reference-typeshttpsmsdnmicrosoftcomlibrary490f96s2aspx-dlya-platformy-nethttpswwwmicrosoftcomnet}



#### Каким образом нужно модифицировать предложенный способ для корректной реализации сравнения по значению объектов — экземпляров [структур][5] (являющихся ["типами по значению" — Value Types][6])? {#kakim-obrazom-nuzhno-modificirovat-predlozhennyy-sposob-dlya-korrektnoy--realizacii-sravneniya-po-znacheniyu-obektov---ekzemplyarov-strukturhttpsmsdnmicrosoftcomlibraryah19swz4aspx-yavlyayuschihsya-tipami-po-znacheniyu---value-typeshttpsmsdnmicrosoftcomlibrarys1ax56chaspx}



Экземпляры [структур][7], в силу своей природы, всегда сравниваются по значению.



Для предопределенных типов, таких как [Boolean][8] или [Int32][9], под сравнением по значению понимается сравнение непосредственно значений экземпляров структур.



Если структура определена разработчиком — пользователем платформы, то сравнение по умолчанию автоматически реализуется как сравнение значений полей экземпляров структур.
(Подробности см. в описании метода [ValueType.Equals(Object)][10] и операторов [==][11] и [!=][12])
Также при этом автоматически определенным образом реализуется метод [ValueType.GetHashCode()][13], перекрывающий метод [Object.GetHashCode()][14].



#### И в этом случае есть несколько существенных подводных камней: {#i-v-etom-sluchae-est-neskolko-suschestvennyh-podvodnyh-kamney}

[Читать дальше →][15]

[1]: https://habrahabr.ru/post/315258/
[2]: https://msdn.microsoft.com/library/0b0thckt.aspx
[3]: https://msdn.microsoft.com/library/490f96s2.aspx
[4]: https://www.microsoft.com/net
[5]: https://msdn.microsoft.com/library/ah19swz4.aspx
[6]: https://msdn.microsoft.com/library/s1ax56ch.aspx
[7]: https://msdn.microsoft.com/library/ah19swz4.aspx
[8]: https://msdn.microsoft.com/library/system.boolean.aspx
[9]: https://msdn.microsoft.com/library/system.int32.aspx
[10]: https://msdn.microsoft.com/library/2dts52z7.aspx
[11]: https://msdn.microsoft.com/library/53k8ybth.aspx
[12]: https://msdn.microsoft.com/library/3tz250sf.aspx
[13]: https://msdn.microsoft.com/library/system.valuetype.gethashcode.aspx
[14]: https://msdn.microsoft.com/library/system.object.gethashcode.aspx
[15]: https://habrahabr.ru/post/315622/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut