有没有一种方法可以使用ReSharper自动生成GetHashCode和Equals方法?

44
在Eclipse中,当我用Java编程时,有一个特性可以自动生成一个基本、高效且无误的hashCode()equals()实现,而且不需要耗费额外的脑力。
那么,在Visual Studio或ReSharper中是否有类似的内置功能呢?

只需键入等于号并按Tab键即可。 - Can Ürek
4个回答

63

是的,Resharper可以做到这一点。在您的类型内部光标处,打开“生成代码”菜单(Alt+Ins 取决于设置或 Resharper -> 编辑 -> 生成代码),然后选择 “等式成员”:

生成代码菜单

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

生成相等成员窗口

如果您从具有两个属性的简单类型开始:

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

Visual Studio可以做到,不需要 ReSharper。 - György Gulyás

6

既然你问到了Visual Studio是否也可以做到这一点:自2017年11月版本(XI.2017)以来,它终于可以生成有用的内容了。

在类内使用Ctrl+.并选择“生成Equals和GetHashCode”

请参见https://dev59.com/kGEi5IYBdhLWcg3wuuYk#48441971


3

如果你的类型正在实现某些东西(接口、基类等),你需要将光标放在类型声明中的“:”之前,否则“生成Equals和GetHashCode”菜单选项将不可用。我将光标放在类型名称旁边,然后菜单选项才出现。 - Carl Heinrich Hancke

0

你可以使用C#中的IEquitable接口,它会自动生成这些方法。


我认为你想说的是IEquatable<T>。 - Lech Osiński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接