В чем смысл модификатора "static new" для функции?
сегодня, я нашел что-то в старом коде. Он имеет "статическое новое" для одной функции. Похоже на то.
class Foo
{
public static void Do()
{
Console.WriteLine("Foo.Do");
}
}
class Bar: Foo
{
public static new void Do()
{
Console.WriteLine("Bar.Do");
}
}
Я не понимаю статический новый модификатор для Do метод в классе бар. В C# статический метод может быть вызван с имени класса вместо имени объекта. Поэтому я не думаю, что есть какая-то разница между "новым" и "нет".
вообще, если какой-то синтаксис не нужен, C# просто лечить это ошибка. Кто-нибудь знает, почему C# допускает такой синтаксис?
4 ответов
Если убрать new из вашего кода, Вы получаете:
предупреждение CS0108: 'бар.Do () 'скрывает унаследованный член' Foo.Do ()'. Используйте ключевое слово new, если было запланировано скрытие.
компилятор C# просто предупреждает Вас, что вы, возможно, делаете что-то, что вы не намеревались, и просит вас вставить new ключевое слово, чтобы подтвердить, что вы знаете, что вы делаете. Кроме подавления предупреждения, у него нет других эффектов.
это относится только к внешним абонентам. Помните, что вы можете вызвать статический метод базового класса, поэтому что-то вроде этого допустимо:
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. Это кажется опечаткой, потому что иначе это не имеет смысла.
предполагая, что это опечатка, модификатор " new " явно скрывает версию базового класса функции Do()
. Это означает, что производная версия Do()
метод эффективно заменяет версию базового класса.
использование "new" здесь документирует тот факт, что унаследованный метод предназначен в качестве замены версия базового класса Do()
.
для получения дополнительной информации см. раздел новый модификатор (C#)