Есть ли способ автоматически генерировать метод equals и hashcode в Visual Studio

В Java, если вы хотите правильно удалить объект из универсального метода Collection по remove(), вам необходимо реализовать методы equals(Object o) и remove(), которые могут быть автоматически сгенерированы в Eclipse. Пример этого метода выглядит так ---> ниже.

  1. Как автоматически сгенерировать этот метод на C # (Visual Studio, я использую VS2013)?

  2. Может, не надо, чтобы метод List.Remove() работал нормально?

  3. ЕСЛИ это невозможно автоматически, как должны выглядеть эталонные Equals методы? Я имею в виду, как это должно выглядеть.

  4. Метод Is Equals() даже используется в List.Remove(), если бы вы могли показать мне, как нужно реализовать Equals(), чтобы он возвращал истину, если мы сравним ОДИНАКОВЫЕ ОБЪЕКТЫ (тот же адрес в памяти)


  @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((centerPanel == null) ? 0 :          centerPanel.hashCode());
        result = prime * result + ((lowerPanel == null) ? 0 : lowerPanel.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if(this == obj)
            return true;
        if(obj == null)
            return false;
        if(getClass() != obj.getClass())
            return false;
        LayoutDemo other = (LayoutDemo) obj;
        if(centerPanel == null) {
            if(other.centerPanel != null)
                return false;
        } else if(!centerPanel.equals(other.centerPanel))
            return false;
        if(lowerPanel == null) {
            if(other.lowerPanel != null)
                return false;
        } else if(!lowerPanel.equals(other.lowerPanel))
            return false;
        return true;
    }

person Yoda    schedule 08.01.2014    source источник
comment
Что вы имеете в виду под автоматически? Даже eclipse не знает, как вы хотите реализовать эти методы, поэтому что означает равенство для вашего настраиваемого объекта. Если вы просто хотите создать тела методов, позвольте вашему классу реализовать IEqualityComparer. Если вы щелкните красную строку с ошибкой под интерфейсом, Visual Studio предложит создать их автоматически. Но они будут содержать только throw new NotImplementedException();.   -  person Tim Schmelter    schedule 08.01.2014
comment
@TimSchmelter Он знает, пример выше.   -  person Yoda    schedule 08.01.2014
comment
так eclipse добавляет все свойства вашего класса в Equals и GetHashCode или только в одно или ни одного? Что автогенерируется выше, все? Equals и GethashCode нетривиальны для сложных объектов.   -  person Tim Schmelter    schedule 08.01.2014
comment
@TimSchmelter Is Equals() даже используется в List.Remove(), если так, не могли бы вы показать мне, как Equals() должен быть реализован, чтобы возвращать истину, если мы сравним ОДИНАКОВЫЕ ОБЪЕКТЫ (тот же адрес в памяти)   -  person Yoda    schedule 08.01.2014
comment
Equals используется в List.Remove и в сравнить два объекта по ссылке: Object.ReferenceEquals(obj1, obj2). Всегда стоит сначала прочитать документацию. Вы найдете соответствующую информацию в разделе примечаний.   -  person Tim Schmelter    schedule 08.01.2014
comment
Просто скопируйте и вставьте свой класс в проект Java в Eclipse, нажмите «Создать hashCode и равно», а затем скопируйте вставку обратно. Еще меньше работы по написанию этих функций.   -  person kajacx    schedule 22.11.2016


Ответы (4)


И вот, с ноября 2017 года даже сама Visual Studio может генерировать значимую реализацию этих методов (по крайней мере, начиная с версии 15.5.2).

Просто нажмите ctrl + . или щелкните правой кнопкой мыши внутри класса и выберите «Быстрые действия», а затем «Создать Equals и GetHashCode».

Документы по этой функции: https://docs.microsoft.com/en-us/visualstudio/ide/reference/generate-equals-gethashcode-methods

    public class Foo
    {
       public Bar Bar { get; set; }
       public string FooBar { get; set; }

    public override bool Equals(object obj)
    {
        var foo = obj as Foo;
        return foo != null &&
               EqualityComparer<Bar>.Default.Equals(Bar, foo.Bar) &&
               FooBar == foo.FooBar;
    }

    public override int GetHashCode()
    {
        var hashCode = 181846194;
        hashCode = hashCode * -1521134295 + EqualityComparer<Bar>.Default.GetHashCode(Bar);
        hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(FooBar);
        return hashCode;
    }

}

Обновление: обратите внимание, что вы все равно можете не доверять VS полностью и тестировать Equals, поскольку, если ваш класс содержит Collection, Equals снова будет зависеть от ссылочного равенства, поскольку этот термин используется:

EqualityComparer<IList<Foo>>.Default.Equals(SomeFoos, other.SomeFoos);

OMG кто-нибудь? И ReSharper тоже это делает.

person Igand    schedule 25.01.2018
comment
Похоже, что в VS for Mac Community Edition тоже есть эта опция, но когда я нажимаю на нее, ничего не происходит. - person bmauter; 31.01.2018
comment
Вы пробовали выключить и снова включить его? Этот метод нужно использовать с VS довольно часто ... кроме этого, я могу думать только об обновлении до последней версии. Я пробовал как Enterprise, так и Communit Edition под Windows, оба работают нормально. - person Igand; 31.01.2018
comment
Ага, я на последней версии. - person bmauter; 02.02.2018
comment
Вам нужно щелкнуть правой кнопкой мыши строку, в которой объявлен класс. Кроме того, вы не увидите эту опцию, если ваш класс уже содержит методы Equals. - person Maxter; 08.08.2019

Автоматическая генерация Equals() во время разработки

Если вы хотите сгенерировать его один раз, а затем поддерживать сгенерированный исходный код вручную (например, если класс изменится), Resharper - полезный инструмент, как @ThomasWeller уже упоминал в своем ответе.

Обратите внимание, что этот подход может привести к трудностям для поиска ошибок, потому что вам нужно не забыть адаптировать Equals() реализацию при изменении класса. Чтобы этого избежать, используйте следующий подход:

Автоматическая генерация Equals() во время выполнения (время статической инициализации)

Если вам нужно решение, которое динамически генерирует методы Equals() и GetHashCode() во время выполнения, вы можете использовать Equ (я автор этой библиотеки). Equ генерирует методы равенства во время статической инициализации и кэширует их, поэтому после статической инициализации производительность такая же, как и при явной реализации.

Вот простой пример:

class Address : MemberwiseEquatable<Address>
{
  public Address(string street, string city)
  {
    Street = street;
    City = city;
  }

  public string Street { get; }
  public string City { get; }
}

При этом следующее выражение true:

new Address("Baker Street", "London") == new Address("Baker Street", "London")

Это самый простой способ использования Equ: просто унаследовать от MemberwiseEquatable<TSelf>. Обратите внимание, что есть и другие возможности, если вы не можете / не хотите наследовать от базового класса.

Замечание о сравнении по значению и по ссылке

В своем последнем вопросе вы хотите знать, как написать Equals метод, который сравнивает объекты по «адресу в памяти». Это называется сравнением эталонного равенства и является реализацией по умолчанию Equals(), которую каждый класс наследует от object. Итак, чтобы получить ссылочное равенство в вашем классе, просто не переопределяйте Equals().

Однако вам следует тщательно продумать, какие объекты вы хотите сравнивать по ссылке, а какие - по значению. Если вы используете терминологию проектирования на основе предметной области, объекты-значения следует сравнивать по значению, тогда как сущности следует сравнивать по ссылке или по идентификатору.

person theDmi    schedule 21.07.2015

Нет. ReSharper может это сделать (наряду с другими полезностями, такими как реализация IEquatable<T>), но простой VS - нет.

person Thomas Weller    schedule 08.01.2014

Я знаю, что это не полная автоматическая генерация, но в Visual Studio 2015 есть способ автоматически сгенерировать хотя бы заглушку метода для функций Hashcode () и Equals ().

  1. В классе, в который вы хотите их добавить, введите Equals  введите описание изображения здесь

  2. Переместите курсор в конец Equals и нажмите вкладку. введите здесь описание изображения

  3. Удалите NotImplementedExceptions и добавьте несколько тестов на равенство.

Надеюсь, это кому-то поможет!

person wolfaviators    schedule 04.02.2016