Является ли использование нового ключевого слова в сигнатуре метода в основном только для удобства чтения? - PullRequest
6 голосов
/ 09 февраля 2012

Я прочитал о new ключевом слове в сигнатуре метода и видел приведенный ниже пример на этом посте, но до сих пор не понимаю, зачем писать new ключевое слово в сигнатуре метода . Если мы его опускаем, он все равно будет делать то же самое. Это скомпилируется. Будет предупреждение, но оно скомпилируется.

Итак, запись new в сигнатуре метода только для удобства чтения?

public class A
{
   public virtual void One() { /* ... */ }
   public void Two() { /* ... */ }
}

public class B : A
{
   public override void One() { /* ... */ }
   public new void Two() { /* ... */ }
}

B b = new B();
A a = b as A;

a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B

Ответы [ 5 ]

9 голосов
/ 09 февраля 2012

Подразумевается в этом вопросе: почему ключевое слово new не требуется при скрытии члена базового класса? Причина - хрупкая проблема базового класса . Предположим, у вас есть библиотека:

public class Base
{
    public void M() { }
}

и вы получили класс в своей собственной кодовой базе:

public class Derived : Base
{
    public void N() { }
}

Теперь авторы библиотеки выпускают новую версию, добавляя еще один метод к Base:

public class Base
{
    public void M() { }
    public void N() { }
}

Если для скрытия метода требовалось новое ключевое слово, теперь ваш код не компилируется! Если сделать новое ключевое слово необязательным, все, что у вас теперь есть, - это новое предупреждение, о котором нужно беспокоиться.

EDIT

Как указывает Эрик Липперт в своем комментарии, «новое предупреждение, о котором нужно беспокоиться», резко преуменьшает цель предупреждения, которое заключается в том, чтобы «размахивать большим красным флагом». Должно быть, я спешил, когда написал это; Это раздражает, когда люди рефлексивно рассматривают предупреждения как раздражения, которые нужно терпеть, а не воспринимают их как полезную информацию.

РЕДАКТИРОВАТЬ 2

Я наконец нашел свой источник для этого ответа, который, конечно, является одним из сообщений Эрика: https://stackoverflow.com/a/8231523/385844

5 голосов
/ 09 февраля 2012

Я предполагаю, что дизайнеры C # хотели, чтобы мы знали, что, не используя virtual и override, мы не получим полиморфное поведение.И это то, что ожидало бы большинство людей с Java.new ясно показывает, что если его опустить, компилятор выдаст предупреждение.

2 голосов
/ 09 февраля 2012

Нет, это не для «читабельности»! Здесь четко указано, что вы не хотите переопределять унаследованное виртуальное сообщение или «скрывать» унаследованный метод случайно, но действительно хотите дать новую реализацию метода.

1 голос
/ 09 февраля 2012

Это не обязательно, но я настоятельно рекомендую это.

MSDN

Переменная была объявлена ​​с тем же именем, что и переменная в базовом классе.Однако новое ключевое слово не использовалось.Это предупреждение информирует вас о том, что вы должны использовать новый;переменная объявляется так, как если бы new использовался в объявлении.

  public static int i = 2;   // CS0108, use the new keyword
  // the compiler parses the previous line as if you had specified:
  // public static new int i = 2;
0 голосов
/ 15 апреля 2016

Да, это просто для удобства чтения.

Функциональность такая же, с или без нее в сигнатуре метода подкласса.

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

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