在 Visual Studio 中生成 Equals 和 GetHashCode 方法重写

此代码生成适用于:

  • C#(编程语言)

什么: 允许生成 EqualsGetHashCode 方法。

什么时候: 如果类型应由一个或多个字段进行比较,而不是由内存中的对象位置进行比较,请生成这些替代。

为什么:

  • 如果要实现值类型,应考虑重写 Equals 方法。 这样做时,可以在 ValueType 上实现 Equals 方法的默认实现中获得更高的性能。

  • 如果要实现引用类型,如果类型看起来像基类型(如 Point、String、BigNumber 等),则应考虑重写 Equals 方法。

  • 重写 GetHashCode 方法,以允许类型在哈希表中正常工作。 阅读有关 相等运算符的更多指南。

操作说明

  1. 将光标放在类型声明行的某个位置。

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

    代码应类似于以下屏幕截图:

    要对其应用生成的方法的突出显示代码的屏幕截图

    小窍门

    不要双击选择类型名称,否则菜单选项将不可用。 只需将光标放在线条上的某个位置即可。

  2. 接下来,选择以下作之一:

    • Ctrl+. 键触发 Quick Actions and Refactorings 菜单。

    • 右键单击并选择 Quick Actions and Refactorings 菜单。

    • 单击 Visual Studio 图标中显示在左边距中的快速作螺丝刀图标的屏幕截图

  3. 在下拉菜单中,选择“ 生成等值”“生成等于”和“GetHashCode”。

    “生成替代”下拉菜单的屏幕截图

  4. “选取成员 ”对话框中,选择要为其生成方法的成员:

    生成替代对话框

    小窍门

    还可以使用对话框底部附近的复选框从此对话生成运算符。

    使用 Equals 默认实现生成和 GetHashCode 方法,如以下代码所示:

    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);
        }
    }
    

    代码应类似于以下屏幕截图:

    生成的方法结果的屏幕截图

另请参阅