Создание переопределений для методов Equals и GetHashCode в Visual StudioGenerate Equals and GetHashCode method overrides in Visual Studio

Область применения этого формирования кода:This code generation applies to:

  • C#C#

Что? Эта возможность позволяет создавать методы Equals и GetHashCode.What: Lets you generate Equals and GetHashCode methods.

Когда? Создавайте эти переопределения, если у вас есть тип, который нужно сравнить по одному или нескольким полям, а не по расположению объектов в памяти.When: Generate these overrides when you have a type that should be compared by one or more fields, instead of by object location in memory.

Зачем?Why:

  • При реализации типа значения рекомендуется переопределить метод Equals.If you're implementing a value type, you should consider overriding the Equals method. При этом обеспечивается повышенная производительность по сравнению с реализацией метода Equals по умолчанию для ValueType.You can gain increased performance over the default implementation of the Equals method on ValueType when you do so.

  • При реализации ссылочного типа рекомендуется переопределить метод Equals, если ваш тип выглядит как базовый, например Point, String, BigNumber и т. д.If you're implementing a reference type, you should consider overriding the Equals method if your type looks like a base type, such as Point, String, BigNumber, and so on.

  • Переопределите метод GetHashCode, чтобы тип правильно работал в хэш-таблице.Override the GetHashCode method to allow a type to work correctly in a hash table. Дополнительные сведения см. в руководстве по операторам равенства.Read more guidance on equality operators.

Практические советыHow-to

  1. Поместите курсор в любую позицию на строке объявления типа.Place your cursor somewhere on the line of your type declaration.

    public class ImaginaryNumber
    {
        public double RealNumber { get; set; }
        public double ImaginaryUnit { get; set; }
    }
    

    Теперь код должен выглядеть как на следующем снимке экрана:Your code should look similar to the following screenshot:

    Снимок экрана: выделенный код, в котором применяется созданный метод

    Совет

    Не выбирайте имя типа двойным щелчком, иначе параметр меню будет недоступен.Do not double-click select the type name, or the menu option won't be available. Просто установите курсор в любую позицию на строке.Just place the cursor somewhere on the line.

  2. Далее выберите одно из следующих действий:Next, choose one of the following actions:

    • Нажмите клавиши CTRL+ .Press Ctrl+. чтобы открыть меню Быстрые действия и рефакторинг.to trigger the Quick Actions and Refactorings menu.

    • Щелкните правой кнопкой мыши и выберите меню Быстрые действия и рефакторинг.Right-click and select the Quick Actions and Refactorings menu.

    • Нажмите кнопкуClick the Снимок экрана: значок отвертки "Быстрые действия" в Visual Studio , которая отображается в левом поле.icon that appears in the left margin.

  3. В раскрывающемся меню выберите Создать Equals(object) или Создать Equals и GetHashCode.In the drop-down menu, select Generate Equals(object) or Generate Equals and GetHashCode.

    Снимок экрана: раскрывающееся меню "Создание переопределений"

  4. В диалоговом окне Выбрать члены выберите члены, для которых хотите создать методы:In the Pick members dialog box, select the members you want to generate the methods for:

    Диалоговое окно создания переопределений

    Совет

    В этом диалоговом окне также можно создавать операторы, используя флажок в нижней части окна.You can also choose to generate operators from this dialog by using the checkbox near the bottom of the dialog.

    Методы Equals и GetHashCode создаются с реализациями по умолчанию, как показано в следующем коде:The Equals and GetHashCode methods are generated with default implementations, as shown in the following code:

    public class ImaginaryNumber : IEquatable<ImaginaryNumber>
    {
        public double RealNumber { get; set; }
        public double ImaginaryUnit { get; set; }
    
        public override bool Equals(object obj)
        {
            return Equals(obj as ImaginaryNumber);
        }
    
        public bool Equals(ImaginaryNumber other)
        {
            return other != null &&
                   RealNumber == other.RealNumber &&
                   ImaginaryUnit == other.ImaginaryUnit;
        }
    
        public override int GetHashCode()
        {
            return HashCode.Combine(RealNumber, ImaginaryUnit);
        }
    }
    

    Теперь код должен выглядеть как на следующем снимке экрана:Your code should look similar to the following screenshot:

    Снимок экрана: результат созданного метода

См. такжеSee also