В случае использования в качестве основы хеш-кода свойства, допускающего чтение и запись, вы получите предупреждение. После того, как объект создан, хеш-код должен быть неизменяемым. В предыдущем примере свойство SSN
get
, что делает его допускающим только чтение, и устанавливать его можно только в конструкторе.Если вы не можете отыскать единый фрагмент уникальных строковых данных, но есть переопределенный метод ToString()
GetHashCode()
на собственном строковом представлении:// Возвратить хеш-код на основе значения, возвращаемого
// методом ToString() для объекта Person.
public override int GetHashCode() => ToString().GetHashCode();
Тестирование модифицированного класса Person
Теперь, когда виртуальные члены класса Object
Console.WriteLine("***** Fun with System.Object *****\n");
// ПРИМЕЧАНИЕ: мы хотим, чтобы эти объекты были идентичными
// в целях тестирования методов Equals() и GetHashCode().
Person p1 = new Person("Homer", "Simpson", 50, "111-11-1111");
Person p2 = new Person("Homer", "Simpson", 50, "111-11-1111");
// Получить строковые версии объектов.
Console.WriteLine("p1.ToString() = {0}", p1.ToString());
Console.WriteLine("p2.ToString() = {0}", p2.ToString());
// Протестировать переопределенный метод Equals().
Console.WriteLine("p1 = p2?: {0}", p1.Equals(p2));
// Протестировать хеш-коды.
// По-прежнему используется хеш-значение SSN
Console.WriteLine("Same hash codes?: {0}", p1.GetHashCode() == p2.GetHashCode());
Console.WriteLine();
// Изменить значение Age объекта p2 и протестировать снова.
p2.Age = 45;
Console.WriteLine("p1.ToString() = {0}", p1.ToString());
Console.WriteLine("p2.ToString() = {0}", p2.ToString());
Console.WriteLine("p1 = p2?: {0}", p1.Equals(p2));
// По-прежнему используется хеш-значение SSN
Console.WriteLine("Same hash codes?: {0}", p1.GetHashCode() == p2.GetHashCode());
Console.ReadLine();
Ниже показан вывод:
***** Fun with System.Object *****
p1.ToString() = [First Name: Homer; Last Name: Simpson; Age: 50]
p2.ToString() = [First Name: Homer; Last Name: Simpson; Age: 50]
p1 = p2?: True
Same hash codes?: True
p1.ToString() = [First Name: Homer; Last Name: Simpson; Age: 50]
p2.ToString() = [First Name: Homer; Last Name: Simpson; Age: 45]
p1 = p2?: False
Same hash codes?: True
Использование статических членов класса System.Object
В дополнение к только что рассмотренным членам уровня экземпляра класс System.Object
static void StaticMembersOfObject()
{
// Статические члены System.Object.
Person p3 = new Person("Sally", "Jones", 4);
Person p4 = new Person("Sally", "Jones", 4);
Console.WriteLine("P3 and P4 have same state: {0}",
object.Equals(p3, p4));
// Р3 и P4 имеют то же самое состояние