2009-03-19 4 views
21

Сегодня я нашел что-то в устаревшем коде. Он имеет «статическое новое» для одной функции. Похоже на это.Что такое «статический новый» модификатор для функции?

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# допускает такой синтаксис?

ответ

37

Если удалить новый из вашего кода вы получите:

предупреждение CS0108: 'Bar.Do()' скрывает унаследованный элемент 'Foo.Do()'. Используйте новое ключевое слово, если было предназначено скрытие.

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

+12

Стоит отметить, что он _only_ подавляет предупреждение. Никаких других эффектов. –

+0

Хорошая точка. Я добавил это в ответ. –

+4

, пока он только подавляет предупреждение, он делает намерение явным (чтобы избежать путаницы), проверьте мой ответ – eglasius

7

посмотреть на this

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() {} 
} 
4

В вашем примере бар второго класса, похоже, не наследуется от Foo. Кажется, это опечатка, потому что в противном случае это не имеет смысла.

Предполагая, что это опечатка, «новый» модификатор явно скрывает версию базового класса функции Do(). Это означает, что производная версия метода Do() эффективно заменяет версию базового класса.

Использование «нового» здесь документирует факт, что унаследованный метод предназначен для замены версии базового класса Do().

Для получения дополнительной информации см new Modifier (C#)

+0

Вот обновленная документация по [новому модификатору] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/new-modifier). – zodo

10

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

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"); } 
} 
Смежные вопросы