Равняется помощникам реализации метода (C#)

Я нашел плагин, который помог мне сделать это за считанные секунды без редактирования кода:

https://wordpress.org/plugins/quick-pagepost-redirect-plugin/

Я нашел его здесь: http://premium.wpmudev.org/blog/wordpress-link-title-external-url/

8
задан Jader Dias 7 June 2009 в 23:45
поделиться

2 ответа

Я использую ReSharper для генерации элементов равенства. При желании он будет реализовывать IEquatable , а также операторы переопределения, если вы этого хотите (чего вы, конечно, никогда не делаете, но в любом случае это круто).

Реализация Equals включает переопределение ] Object.Equals (Object) , а также вариант со строгой типизацией (который позволяет избежать ненужной проверки типов). Менее типизированная версия вызывает строго типизированную версию после выполнения проверки типа. Строго типизированная версия выполняет проверку равенства ссылок ( Object.ReferenceEquals (Object, Object) ), а затем сравнивает значения всех полей (ну, только тех, которые вы указываете генератору включить).

Что касается GetHashCode , интеллектуальная факторизация значений поля GetHashCode объединяется (с использованием снятого флажка , чтобы избежать исключений переполнения, если вы используете компилятора] отмечен вариант ). Каждое из значений поля (кроме первого) перед объединением умножается на простые числа. Вы также можете указать, какие поля никогда не будут нулевыми, и при этом будут отброшены все нулевые проверки.

Вот что вы получите для своего класса Polygon , нажав ALT + Insert и выбрав « Generate Equality Members »:

public class Polygon : IEquatable<Polygon>
{
    public Point[] Vertices { get; set; }

    public bool Equals(Polygon other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return Equals(other.Vertices, Vertices);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != typeof (Polygon)) return false;
        return Equals((Polygon) obj);
    }

    public override int GetHashCode()
    {
        return (Vertices != null ? Vertices.GetHashCode() : 0);
    }
}

Некоторые из функций, о которых я говорил выше, не применяются, поскольку есть только одно поле. Также обратите внимание, что он не проверял содержимое массива.

В общем, однако, ReSharper выкачивает много отличного кода за считанные секунды. И эта функция стоит в моем списке вещей, которые делают ReSharper таким замечательным инструментом.

8
ответ дан 5 December 2019 в 17:40
поделиться

Для сравнения двух массивов элементов я использую метод расширения SequenceEqual .

Что касается общих Equals и GetHashCode, существует метод, основанный на сериализации, который может сработать для вас.

Использование MemoryStream и BinaryFormatter для повторного использования функций GetHashCode и DeepCopy

2
ответ дан 5 December 2019 в 17:40
поделиться
Другие вопросы по тегам:

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