#c# #c#-9.0
#c# #c #-9.0
Вопрос:
Как запись 9.0 реализует равенство на основе значений для свойств объектов (например, массивов)?
Я заметил, что два объекта записи одного и того же типа, имеющие свойство timestamp, представляющее собой массив байтов, не распознаются как равные, несмотря на то, что все байты одинаковы.
Пример:
public record C
{
public byte[] Timestamp {get; set;}
}
будет реализовано как
public virtual bool Equals(C other)
{
return (...) amp;amp; EqualityComparer<byte[]>.Default.Equals(<Timestamp>k__BackingField, other.<Timestamp>k__BackingField);
}
он использует EqualityComparer, который не использует SequenceEquals, поэтому в результате две записи с одинаковым содержимым не равны.
using System.Collections.Generic;
using System.Diagnostics;
var a = new byte[1] { 1 };
var b = new byte[1] { 1 };
var isEqual = EqualityComparer<byte[]>.Default.Equals(a, b);
Debug.Print(isEqual.ToString()); // false
Я думал, что записи будут реализовывать равенство на основе значений для каждого свойства, но это, очевидно, все еще основано на ссылках, в частности, для массивов. Я на неверном пути или это просто так?
Комментарии:
1. «Я думал, что записи будут поддерживать равенство на основе значений для каждого свойства» — я думаю, что это реальная проблема, предполагая, что ваши предположения являются спецификацией. Особенно когда вы, кажется, очень хорошо знаете, что записи используются
EqualityComparer<>.Default.Equals()
для определения равенства.2. @StackOverthrow Если вы хотите пожаловаться разработчикам C # на то, что вам не нравится, как они разработали функцию, SO не место для этого. Они этого не увидят, и люди здесь ничего не смогут с этим поделать. Не стесняйтесь предоставлять эту обратную связь разработчикам напрямую, если хотите.
3. @StackOverthrow: раздражает. К счастью для вас, C # — это просто C #, поэтому вы можете написать свой собственный, лучший код!
4. @sven вы можете взглянуть на библиотеку Nito Comparers Стивена Клири для большей гибкости. Функциональность, которую вы ищете,
record
предоставляется из коробки в Nito.