C #: открытая новая строка ToString () VS открытая переопределенная строка ToString () - PullRequest
20 голосов
/ 18 июня 2009

Я хочу переопределить функцию ToString () в одном из моих классов.

Я написал

public string ToString()

... и работает нормально. Но ReSharper говорит мне изменить это либо на

public new string ToString() 

или

public override string ToString()

Какая разница? Почему C # требует что-то подобное?

Ответы [ 9 ]

34 голосов
/ 19 июня 2009

Если вы используете public string ToString(), неясно, что вы намеревались сделать . Если вы хотите изменить поведение ToString посредством полиморфизма, тогда override. Вы могли бы добавить new ToString(), но это было бы глупо. Не делай этого!

Разница в том, что происходит, когда вы делаете:

MyType t = new MyType();
object o = t;
Console.WriteLine(t.ToString());
Console.WriteLine(o.ToString());

Если вы override, оба выведут вашу новую версию. Если вы new, только первая будет использовать вашу новую версию; вторая будет использовать оригинальную реализацию.

Я не думаю, что я когда-либо видел, чтобы кто-нибудь использовал скрытие метода (он же new) на ToString().

9 голосов
/ 18 июня 2009

Проблема в том, что ToString является виртуальным методом. Чтобы переопределить виртуальный метод в C #, вам нужно указать ключевое слово override.

Вы почти наверняка не хотите "новую" версию. ,

4 голосов
/ 19 июня 2009

Модификатор new будет скрывать или «скрывать» элемент с такой же сигнатурой в базовом классе, где overriding обеспечивает новую реализацию элемента, унаследованного от базового класса. Вот хорошая статья о различиях между затенением и переопределением.

2 голосов
/ 19 июня 2009

Вы хотите переопределить. На самом деле нет смысла прятаться в вашем случае (используя «новый»).

Вот статья о разнице между переопределением и сокрытием .

1 голос
/ 30 января 2012

ToString - это виртуальный метод в базовом классе. Чтобы текущий член переопределил эту реализацию, добавьте ключевое слово override. В противном случае добавьте новое ключевое слово.

1 голос
/ 19 июня 2009

C # не требует этого; Решарпер делает. Это требуется, потому что два ключевых слова представляют существенно различное поведение, и если вы не укажете, кто-то, читающий ваш код, может не совсем ясно, какое поведение по умолчанию (это new.)

В этом случае вы явно хотите переопределить.

0 голосов
/ 21 сентября 2012

Метод ToString () доступен для каждого типа в .NET , так как этот метод определен как виртуальный метод в базовом классе System.Object, и все типы прямо или косвенно наследуются от System.Object. , Если реализация метода ToString () по умолчанию не соответствует вашим целям, вы можете переопределить (использовать ключевое слово override) или скрыть (использовать новое ключевое слово) его.

Я натолкнулся на следующие 2 отличные статьи, объясняющие причины переопределения метода ToString () и разницу между сокрытием метода и переопределением метода. Существует также YouTube видео по тем же понятиям
Причина переопределения ToString ()
Разница между сокрытием метода и переопределением метода

0 голосов
/ 19 июня 2009

Моя личная рекомендация - не прятаться; это вызывает много неясностей и решает мало.

0 голосов
/ 19 июня 2009

Все, что вы делаете, зависит от поведения, которое вы хотите. В этой статье объясняется, как работает поведение ToString в зависимости от того, как вы определили метод и на каком уровне иерархии классов вы вызываете ToString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...