Какой смысл в модификаторе «статический новый» для функции?
-
20-08-2019 - |
Вопрос
Сегодня я нашел что -то в устаревшем коде. Он имеет «статический новый» для одной функции. Похоже, это.
class Foo
{
public static void Do()
{
Console.WriteLine("Foo.Do");
}
}
class Bar: Foo
{
public static new void Do()
{
Console.WriteLine("Bar.Do");
}
}
Я не понимаю Статический новый модификатор для Делать Метод в классе Бар. Анкет В C#статический метод можно использовать только с именем класса вместо имени объекта. Итак, я не думаю, что есть какая -то разница между наличием «нового», а не.
Как правило, если какой -то синтаксис не нужен, C# просто обрабатывать это ошибка. У кого -нибудь есть представление о том, почему C# позволяет такой синтаксис?
Решение
Если вы удалите новый Из своего кода вы получаете:
ПРЕДУПРЕЖДЕНИЕ CS0108: 'bar.do ()' скрывает унаследованный член 'foo.do ()'. Используйте новое ключевое слово, если укрытие было предназначено.
Компилятор C# просто предупреждает вас, что вы можете делать то, чего не собирались, и просит вас вставить новый Ключевое слово, чтобы подтвердить, что вы знаете, что делаете. Помимо подавления предупреждения, оно не имеет других эффектов.
Другие советы
Это относится только к внешним абонентам. Помните, что вы можете назвать статический метод базового класса, так что что -то подобное действительно:
class Foo
{
public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
public static void Something()
{
Do();
}
}
Вот почему предупреждение говорит вам, чтобы вы поставили новый, вы хотите избежать путаницы при этом:
class Foo
{
public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
public static void Something()
{
Do();
}
public static new void Do() { Console.WriteLine("Bar.Do"); }
}
посмотри на это
public class BaseC { public static int x = 55; public static int y = 22; } public class DerivedC : BaseC { // Hide field 'x'. new public static int x = 100; static void Main() { // Display the new value of x: Console.WriteLine(x); // Display the hidden value of x: Console.WriteLine(BaseC.x); // Display the unhidden member y: Console.WriteLine(y); } } /* Output: 100 55 22 */
Ваш пример, чтобы прояснить, должен быть
public class Foo
{
public static void Do() {}
}
public class Bar :Foo
{
public new static void Do() {}
}
В вашем примере второй класс, похоже, не наследует от Foo. Кажется, это опечатка, потому что в противном случае это не имеет смысла.
Предполагая, что это опечатка, «новый» модификатор явно скрывает версию базового класса функции Do()
. Анкет Это означает, что производная версия Do()
Метод эффективно заменяет версию базового класса.
Использование «нового» здесь документирует тот факт, что унаследованный метод предназначен в качестве замены для базового класса версии Do()
.
Для получения дополнительной информации см. новый модификатор (C#)