GetHashCode()中引用的非只读字段

now*_*ed. 26 .net c# .net-4.0

从重写概念开始,我重写方法EqualsGetHashCode.

主要是我想出了这个"非常简单的代码":

internal class Person
    {
        public string name;

        public int age;

        public string lname;

        public Person(string name, int age, string lname)
        {
            this.name = name;
            this.age = age;
            this.lname = lname;
        }

        public override bool Equals(object obj)
        {
            var person = obj as Person;
            if (person != null)
            {
                return person.age == this.age && person.name == this.name && person.lname == this.lname;
            }

            return false;
        }

        public override int GetHashCode()
        {
            return this.age.GetHashCode() * this.name.GetHashCode() * this.lname.GetHashCode();
        }
    }
Run Code Online (Sandbox Code Playgroud)

虽然这很有效,但我的"共同开发者"Mr.Resharper给了我一些建议:

  1. GetHashCode()中引用的非只读字段.建议来自这行代码:

return this.age.GetHashCode() * this.name.GetHashCode() * this.lname.GetHashCode();

  1. 我们应该只为属性使用GetHashCode吗?

Bal*_*ick 23

总结一下评论中讨论的内容:

Hashing旨在为给定对象提供一个不会发生变化的值,无论发生什么变化 - 因此最好只依赖于GetHashCode方法中的只读字段.

首先,我会建议把namelname外地只读的,因为他们可能在你的使用方案没有改变.

至于age这是经常变化的东西,所以最好存储一个DateTime永不改变的出生日期.然后你也可以把它做成只读.