2009-03-19 16 views
21

Aujourd'hui, j'ai trouvé quelque chose dans le code existant. Il a "statique nouveau" pour une fonction. Ça ressemble à ça.Quel est le point du modificateur "static new" pour une fonction?

class Foo 
{ 
    public static void Do() 
    { 
     Console.WriteLine("Foo.Do"); 
    } 
} 

class Bar: Foo 
{ 
    public static new void Do() 
    { 
     Console.WriteLine("Bar.Do"); 
    } 
} 

Je ne comprends pas le modificateur statique nouveau pour la méthode Do en classe Bar. En C#, la méthode statique ne peut être invoquée qu'avec le nom de la classe au lieu du nom de l'objet. Donc, je ne pense pas qu'il y ait une différence entre avoir le "nouveau" et non.

Généralement, si une syntaxe est inutile, C# traite juste c'est erreur. Quelqu'un a une idée de la raison pour laquelle C# permet une telle syntaxe?

Répondre

37

Si vous supprimez la nouvelle de votre code que vous obtenez:

warning CS0108: 'Bar.Do()' masque le membre hérité 'Foo.Do()'. Utilisez le nouveau mot-clé si la cache était destinée.

Le compilateur C# que vous avertit que vous pourriez faire quelque chose que vous ne l'avez pas l'intention et vous demande d'insérer le nouveau mot-clé pour confirmer que vous savez ce que vous faites. En plus de supprimer l'avertissement, il n'a aucun autre effet.

+12

Il est à noter que _only_ supprime un avertissement. Aucun autre effet –

+0

Bon point. J'ai ajouté cela à la réponse. –

+4

alors qu'il ne supprime que l'avertissement, il rend l'intention explicite (pour éviter toute confusion), vérifiez ma réponse – eglasius

7

un coup d'oeil à 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 
*/ 

Votre exemple, pour préciser, devrait être

public class Foo 
{ 
    public static void Do() {} 
} 
public class Bar :Foo 
{ 
    public new static void Do() {} 
} 
4

Dans votre exemple, la barre de seconde classe ne semble pas hériter de Foo. Cela semble être une faute de frappe parce que cela n'a pas de sens autrement.

En supposant qu'il s'agisse d'une faute de frappe, le "nouveau" modificateur cache explicitement la version de la classe de base de la fonction Do(). Cela signifie que la version dérivée de la méthode Do() remplace efficacement la version de la classe de base. L'utilisation de "new" documente ici le fait que la méthode héritée est destinée à remplacer la version de classe de base Do().

Pour plus d'informations, consultez new Modifier (C#)

+0

Voici la documentation mise à jour du [nouveau modificateur] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/new-modifier). – zodo

10

Cela applique uniquement pour les appels externes. Rappelez-vous que vous pouvez appeler une méthode statique de la classe de base, donc quelque chose comme ceci est valable:

class Foo 
{ 
    public static void Do() { Console.WriteLine("Foo.Do"); } 
} 
class Bar : Foo // :Foo added 
{ 
    public static void Something() 
    { 
     Do(); 
    } 
} 

C'est la raison pour laquelle l'avertissement vous dit de mettre la nouvelle, vous voulez éviter toute confusion lors de cette opération:

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"); } 
}