有没有办法使用ReSharper自动生成GetHashCode和Equals?

时间:2013-02-01 18:17:32

标签: .net visual-studio resharper equals hashcode

在eclipse中,当我使用Java编写代码时,有一个功能可以自动生成hashCode()equals()的基本,高效且无错误的实现,而不会消耗大脑的力量。

是否在Visual Studio或ReSharper中内置了类似的功能?

4 个答案:

答案 0 :(得分:55)

是的,Resharper可以做到这一点。将光标放在您的类型中,打开“生成代码”菜单( Alt + Ins ,具体取决于设置或 Resharper - >编辑 - >生成代码),并选择“Equality members”:

Generate code menu

这将打开一个窗口,您可以在其中选择用于相等的成员,以及有关生成的代码的一些选项(例如,如果您的类型实现IEquatable<T>):

Generate equality members window

如果您从一个包含两个属性的简单类型开始:

class Person
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
}

然后生成的代码可能类似于:

class Person : IEquatable<Person>
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }

    public bool Equals(Person other)
    {
        if (ReferenceEquals(null, other))
            return false;
        if (ReferenceEquals(this, other))
            return true;
        return string.Equals(FirstName, other.FirstName) && string.Equals(LastName, other.LastName);
    }

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

    public override int GetHashCode()
    {
        unchecked
        {
            return ((FirstName != null ? FirstName.GetHashCode() : 0) * 397) ^ (LastName != null ? LastName.GetHashCode() : 0);
        }
    }
}

答案 1 :(得分:2)

使用Visual Studio本身的真正解决方案。 有一个内置的机制,可以生成以下功能:

  1. 将光标放在类型声明的行上。
  2. 单击显示在左边缘的螺丝刀图标。
  3. 从下拉菜单中选择Generate Equals(对象)或Generate Equals和GetHashCode。

带有图片的描述: https://docs.microsoft.com/en-us/visualstudio/ide/reference/generate-equals-gethashcode-methods?view=vs-2019#how-to

答案 2 :(得分:1)

因为您询问Visual Studio是否也可以这样做: 自XI.2017以来,它最终可以产生一些有用的东西。

在类中使用 ctr + 并选择“Generate Equals and GetHashCode”

请参阅https://stackoverflow.com/a/48441971/4547594

答案 3 :(得分:0)

您可以使用C#IEquitable接口,它将自动为您生成这些方法。