Выполняя рефакторинг, я создал метод, подобный приведенному ниже. Тип данных был изменен для простоты.
Ранее у меня был такой оператор присваивания:
MyObject myVar = new MyObject();
Он был изменен на это случайно:
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
Это было результатом моей ошибки вырезания / вставки, но new
ключевое слово in private static new
допустимо и компилируется.
Вопрос : Что означает new
ключевое слово в сигнатуре метода? Я полагаю, это что-то введенное в C # 3.0?
Чем это отличается от override
?
new
модификатора в качестве модификатора для метода (или другого члена типа) не является «чем-то введенным в C # 3.0». Он был там с первой версии C #.Ответы:
Новая ссылка на ключевое слово из MSDN:
Справочник MSDN
Вот пример, который я нашел в сети от Microsoft MVP, который имеет смысл: Ссылка на оригинал
Переопределение можно использовать только в очень особых случаях. Из MSDN:
Таким образом, ключевое слово new необходимо, чтобы позволить вам «переопределить» невиртуальные и статические методы.
источник
new
, но я думаю, что это буквально только для удобства чтения - компилятор просто предупреждает вас, что когда вы вызываете метод производного класса с тем же именем, что и базовый, вы не получите метод базового класса, который вы можете думаю .... это странно ... чисто для удобочитаемости?IMyInterface
будет вызываться реализация класса Derived. Таким образомIMyInterface c = new B()
назовем реализацию класса B. Если только один класс реализует интерфейс, будет вызван метод из класса, который его реализует.Нет, на самом деле это не «новое» (простите за каламбур). В основном он используется для «сокрытия» метода. IE:
Если вы сделаете это:
Будет вызван метод в Base, а НЕ в производном.
Дополнительная информация: http://www.akadia.com/services/dotnet_polymorphism.html
Повторите свое редактирование: в примере, который я привел, если вы должны «переопределить» вместо использования «new», то при вызове b.Method (); Метод производного класса будет вызываться из-за полиморфизма.
источник
Как объясняли другие, он используется, чтобы скрыть существующий метод. Это полезно для переопределения метода, который не является виртуальным в родительском классе.
Имейте в виду, что создание «нового» члена не полиморфно. Если вы приведете объект к базовому типу, он не будет использовать член производного типа.
Если у вас есть базовый класс:
А потом производный класс:
Если вы объявляете тип
DerivedType
и затемDoSomething()
приводите его, метод не будет полиморфным, он вызовет метод базового класса, а не производный.источник
override
сигнатуры методаnew
базовый тип скрывается от производного типа, потому что не всегда ли вы можете получить доступ к базовому типу, используяbase.<type>
нотацию?base.<method>
, а также можно вызывать извне, если вы приведете его к базовому типу в своем коде. Технически точнее думать об этом как о «переопределении» базового метода, чем о «сокрытии».Из документов:
Если методу в производном классе предшествует ключевое слово new, метод определяется как независимый от метода в базовом классе.
Что это означает на практике:
Если вы наследуете от другого класса и у вас есть метод с той же сигнатурой, вы можете определить его как «новый», чтобы он не зависел от родительского класса. Это означает, что если у вас есть ссылка на «родительский» класс, тогда эта реализация будет выполнена, если у вас есть ссылка на дочерний класс, тогда эта реализация будет выполнена.
Лично я стараюсь избегать ключевого слова 'new', поскольку обычно оно означает, что у меня неправильная иерархия классов, но бывают случаи, когда это может быть полезно. Одно место - для управления версиями и обратной совместимости.
В MSDN есть много информации по этому поводу .
источник
new
присутствием здесь. Это синтаксис / читабельность.Это означает, что метод заменяет метод с тем же именем, унаследованный от базового класса. В вашем случае у вас, вероятно, нет метода с таким именем в базовом классе, а это означает, что ключевое слово new совершенно излишне.
источник
Короче говоря - это НЕ требуется, это НЕ меняет поведения, и это ИСТИННО для удобства чтения.
Вот почему в VS вы увидите немного волнистости, но ваш код будет компилироваться и работать отлично и, как ожидалось.
Следует задаться вопросом, действительно ли стоило создавать
new
ключевое слово, когда все, что оно означает, - это подтверждение разработчика: «Да, я знаю, что скрываю базовый метод, да, я знаю, что не делаю ничего, связанного сvirtual
илиoverriden
(полиморфизмом) - Я действительно хочу создать свой собственный метод ».Для меня это немного странно, но, возможно, только потому, что я вырос в
Java
фоновом режиме и есть фундаментальное различие междуC#
наследованием иJava
: InJava
, методы являются виртуальными по умолчанию, если это не указано вfinal
. ВC#
, методы по умолчанию являются окончательными / конкретными, если не указано иноеvirtual
.источник
Из MSDN :
источник
Остерегайтесь этой ошибки.
У вас есть метод, определенный в интерфейсе, который реализован в базовом классе. Затем вы создаете производный класс, который скрывает метод интерфейса, но специально не объявляет производный класс как реализующий интерфейс. Если вы затем вызовете метод через ссылку на интерфейс, будет вызван метод базового класса. Однако, если производный класс специально реализует интерфейс, его метод будет вызываться в зависимости от того, какой тип ссылки используется.
источник