代码之家  ›  专栏  ›  技术社区  ›  SaguiItay

ObjectIDGenerator与哈希集<T>

  •  1
  • SaguiItay  · 技术社区  · 17 年前

    1 回复  |  直到 17 年前
        1
  •  4
  •   JaredPar    17 年前

    ObjectIdGenerator查看引用标识。当检查一个对象是否已经存在时,它只会对两个对象实例执行==调用。这将归结为引用比较,因为此时对象是静态类型的对象。这很好,除非你的对象明确使用。Equals()表示相等。如果两个对象相等。等于()但引用不同,ObjectIDGenerator会将它们视为不同的对象。可能不是你想要的。

    显示差异的示例代码:

    class Person
    {
        public readonly string Name;
        public Person(string name) { Name = name; }
        public override int GetHashCode()
        {
            return Name.GetHashCode();
        }
        public override bool Equals(object obj)
        {
            var other = obj as Person;
            if (other == null)
            {
                return false;
            }
            return StringComparer.Ordinal.Equals(Name, other.Name);
        }
    }
    
    public static void Example()
    {
        var gen = new ObjectIDGenerator();
        bool isFirst;
        var person1 = new Person("John");
        var person2 = new Person("Bob");
        gen.GetId(person1, out isFirst);    // isFirst = true
        gen.GetId(person1, out isFirst);    // isFirst = false
        gen.GetId(person2, out isFirst);    // isFirst = true
        gen.GetId(new Person("John"), out isFirst); // isFirst = true even though they are .Equals()
    
        var set = new HashSet<Person>();
        set.Add(person1);
        var contains1 = set.Contains(person1);              // true
        var contains2 = set.Contains(new Person("John"));   // true
    }
    
    推荐文章