Какую проблему решает IStructuralEquatable и IStructuralComparable?

Я заметил эти два интерфейса и несколько связанных классов, были добавлены в .NET 4. Они кажутся мне немного лишними; Я читал о них в нескольких блогах, но до сих пор не могу понять, какую проблему они решают, что было сложно до .NET 4.

Какая польза от IStructuralEquatable и IStructuralComparable ?

55
задан thecoop 31 August 2010 в 03:09
поделиться

1 ответ

Все типы в .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.Equals, вы также переопределите Object.Equals для согласованности. Как в этом случае вы поддержите ссылочное и структурное равенство?

46
ответ дан 7 November 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: