English 中文(简体)
平等与自由之家
原标题:Equals and GetHashCode
  • 时间:2009-09-23 16:28:14
  •  标签:

你们对这个人阶级的想法是什么? 取消平等地位和平等地位是否是一种坏的想法或最佳做法?

public class Person {
    public int PersonId { get; set; }
    public string Name { get; set; }
    public override bool Equals(object obj) {
        var person = obj as Person;

        return PersonId == person.PersonId;
    }
    public override int GetHashCode() {
        return PersonId;
    }

}

使用:

 static void Main(string[] args) {           

            var list = new List<Person>();
            list.Add(new Person(){ PersonId = 1, Name = "Mike"});
            list.Add(new Person() { PersonId = 2, Name = "Michael Sync" });
            list.Add(new Person(){ PersonId = 1, Name = "Mike"});

            var list1 = new List<Person>();
            list1.Add(new Person() { PersonId = 1, Name = "Mike" });
            list1.Add(new Person() { PersonId = 3, Name = "Julia" });

            var except = list.Except(list1);

            foreach (var item in except) {
                Console.WriteLine(item.Name);
            }
            Console.ReadKey();

        }
最佳回答

几点:

  1. 它不会失去安全或“不同类型”的安全。 为此:

    new Person().Equals(new Object());
    

    new Person().Equals(null);
    

    孟加拉。

  2. Classes defining equality operations should usually be immutable IMO. Changing the contents of an object after using it as a dictionary key is a Bad Thing, f或 example.

  3. 考虑实施<条码>

迅速重新实施,这仍然假定你想要在ID上实现平等。

public sealed class Person : IEquatable<Person> {

    private readonly int personId;
    public int PersonId { get { return personId; }

    private readonly string name;
    public string Name { get { return name; } }

    public Person(int personId, string name) {
        // Is a null name valid? If not, throw here.
        this.personId = personId;
        this.name = name;
    }

    public override bool Equals(object obj) {
        return Equals(obj as Person);
    }

    public Equals(Person other) {
        return other != null && other.personId == personId;
    }

    public override int GetHashCode() {
        return personId;
    }
}
问题回答

是错了。 您应当never在GetHashCode的计算中使用变卖财产。 这样做使你能够看到无数次难以追踪 b。

我可以看到的一个问题是,如果出现新的(未挖掘的)记录(零点)——除非你连续做一些事情,否则你会给那些人带来许多碰撞。 但是,您的究竟是需要作为关键内容使用Person? 我个人并不认为我是谁......





相关问题
热门标签