Если я переопределить ToString, нужно ли мне переопределить Equals и GetHashCode? - PullRequest
5 голосов
/ 05 ноября 2011

Я уверен, что если я переопределю Equals, мне нужно переопределить GetHashCode, чтобы убедиться, что структуры словаря и т. Д. Работают должным образом.

Но если я просто хочу переопределить ToString, у меня все еще естьпереопределить методы Equals и GetHashCode.

Ответы [ 5 ]

8 голосов
/ 05 ноября 2011

Переопределение этих трех методов служит трем различным целям:

  1. ToString: выходное представление объекта.
  2. Equals: если два объекта представляют одну и ту же вещь.Использует GetHashCode в своей реализации по умолчанию.
  3. GetHashCode: используется для индексации объектов.Несколько дополнительных тем здесь, включая полуединственность и распределение хеш-значений.

Как вы можете видеть, 2 и 3 связаны, но 1 - это отдельный.Если вы не реализуете Equals, чтобы просто проверить, равны ли ToString двух объектов, что, скорее всего, будет ошибкой.:)

Итак, краткий ответ уже дан: вы можете переопределить ToString, не переопределяя два других метода.Вполне нормально даже перегружать метод ToString.См. DateTime для примера: http://msdn.microsoft.com/en-us/library/zdtaw1bw.aspx

1 голос
/ 05 ноября 2011

Нет, вам не нужно переопределять Equals и GetHashCode, они не связаны с ToString

0 голосов
/ 05 ноября 2011

ToString предназначен только для строкового представления вашего объекта. Ничего больше.

Как вы уже сказали, если бы вы переопределяли Equals, лучше всего переопределить GetHashCode для HashTables. Однако эти две операции не связаны.

0 голосов
/ 05 ноября 2011

Вы можете переопределить его только для определенного класса, или вы имеете в виду переопределить его для каждого класса / объекта?

public class YourClass
{
    // Other stuff here...

    public override string ToString()
    {
        // Do whatever you want here instead, or return base.ToString(); for the default behavior
    }
}

Но нет, это не относится к другим методам, и вы можете выбрать то, что хотите переопределить

0 голосов
/ 05 ноября 2011

Нет, вам не нужно переопределять Equals и GetHashCode, если только переопределяет ToString ()

...