Вопрос по c#, oop – C #: открытая новая строка ToString () VS открытая переопределенная строка ToString ()

20

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

я написал

public string ToString()

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

public new string ToString() 

или же

public override string ToString()

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

+1 за правильное написание вашего имени ;-p (и за разумный вопрос ...) Marc Gravell♦

Ваш Ответ

9   ответов
1

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

2
4

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

1

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededlanguageError: User Rate Limit Exceeded
0

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

34

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

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

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

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

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

Error: User Rate Limit ExceededthatError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded marcgg
0

это вызывает много неясностей и решает мало.

0

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

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

9

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

Вы почти наверняка не хотите & quot; новое & quot; версия. ,

Похожие вопросы