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
}