Я заметил эти два интерфейса и несколько связанных классов, были добавлены в .NET 4. Они кажутся мне немного лишними; Я читал о них в нескольких блогах, но до сих пор не могу понять, какую проблему они решают, что было сложно до .NET 4.
Какая польза от IStructuralEquatable
и IStructuralComparable
?
Все типы в .NET поддерживают метод Object.Equals()
, который по умолчанию сравнивает два типа на равенство ссылок . Однако иногда также желательно иметь возможность сравнивать два типа на структурное равенство .
Лучшим примером этого являются массивы, которые в .NET 4 теперь реализуют интерфейс IStructuralEquatable
. Это позволяет различать, сравниваете ли вы два массива на ссылочное равенство или на «структурное равенство» — имеют ли они одинаковое количество элементов с одинаковыми значениями в каждой позиции. Вот пример:
int[] array1 = new int[] { 1, 5, 9 };
int[] array2 = new int[] { 1, 5, 9 };
// using reference comparison...
Console.WriteLine( array1.Equals( array2 ) ); // outputs false
// now using the System.Array implementation of IStructuralEquatable
Console.WriteLine( StructuralComparisons.StructuralEqualityComparer.Equals( array1, array2 ) ); // outputs true
Другие типы, которые реализуют структурное равенство/сравнимость, включают кортежи и анонимные типы, которые явно выигрывают от возможности выполнять сравнение на основе их структуры и содержимого.
Вы не задали вопрос:
Почему у нас есть
IStructuralComparable
иIStructuralEquatable
, когда уже есть Существуют ли интерфейсыIComparable
иIEquatable
?
Ответ, который я бы предложил, заключается в том, что в целом желательно проводить различие между эталонными сравнениями и структурными сравнениями. Обычно ожидается, что если вы реализуете IEquatable
, вы также переопределите Object.Equals
для согласованности. Как в этом случае вы поддержите ссылочное и структурное равенство?