Подтвердить что ты не робот

С#: публичная новая строка ToString() VS public override string ToString()

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

Я написал

public string ToString()

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

public new string ToString() 

или

public override string ToString()

Какая разница? Почему С# требует что-то вроде этого?

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Личная рекомендация от меня заключалась бы в том, чтобы не скрывать; он вызывает множество двусмысленностей и мало решает.

Ответ 9

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

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