2009-06-18 4 views
17

Je souhaite redéfinir la fonction ToString() dans l'une de mes classes.C#: chaîne publique publique ToString() VS chaîne de substitution publique ToString()

j'ai écrit

public string ToString() 

... et il fonctionne très bien. Mais ReSharper me dit de changer en

public new string ToString() 

ou

public override string ToString() 

Quelle est la différence? Pourquoi C# nécessite quelque chose comme ça?

+0

+1 pour l'orthographe de votre nom la ;-p manière sensible (et pour qu'il soit une question raisonnable ...) –

Répondre

32

Si vous utilisez public string ToString() il n'est pas clair ce que vous prévu à faire. Si vous voulez modifier le comportement de ToString via le polymorphisme, alors override. Vous pourriez ajouter un new ToString(), mais ce serait idiot. Ne fais pas ça!

La différence est ce qui se passe quand vous faites:

MyType t = new MyType(); 
object o = t; 
Console.WriteLine(t.ToString()); 
Console.WriteLine(o.ToString()); 

Si vous override, tous les deux la sortie de votre nouvelle version. Si vous new, seul le premier utilisera votre nouvelle version; la seconde utilisera l'implémentation d'origine.

Je ne pense pas que j'ai jamais vu sur ToString() cacher la méthode d'utilisation de tout le monde (aka new).

+1

Bel exemple de code. Je travaillais sur quelque chose de similaire. – RichardOD

+0

merci, très clair et utile – marcgg

+0

Malheureusement, j'ai vu plusieurs exemples de méthodes se cachant en C#. Aucun d'eux n'était jolie. – JaredPar

9

Le problème est que ToString est une méthode virtuelle. Pour remplacer une méthode virtuelle en C#, vous devez spécifier le mot-clé override.

Vous ne voulez certainement pas la "nouvelle" version. .

1

C# ne l'exige pas; Resharper fait. Il l'exige parce que les deux mots clés représentent un comportement significativement différent, et si vous ne le spécifiez pas, quelqu'un qui lit votre code pourrait ne pas savoir exactement quel est le comportement par défaut (new.)

Dans ce cas, vous voulez clairement pour passer outre.

+1

En fait, même sans R # vous recevrez un avertissement à ce sujet. Le * language * ne l'exige pas, mais même l'IDE "express" (gratuit) sait que c'est une mauvaise idée. –

+0

Une autre raison pour laquelle j'aime "Traiter les avertissements comme des erreurs" – lesscode

0

Ce que vous faites tout dépend du comportement que vous voulez. This article explique comment fonctionne le comportement de ToString en fonction de la manière dont vous avez défini la méthode et du niveau dans une hiérarchie de classes que vous appelez ToString.

4

Le new modifier va masquer ou "ombrer" le membre avec la même signature dans la classe de base où overriding fournit une nouvelle implémentation d'un membre hérité d'une classe de base. Voici un good article sur les différences entre l'ombrage et le dépassement.

0

Une recommandation personnelle de ma part serait de ne pas utiliser de dissimulation; il provoque beaucoup d'ambiguïtés et résout peu.

1

ToString est une méthode virtuelle dans la classe de base. Pour que le membre actuel remplace cette implémentation, ajoutez le mot clé override. Sinon, ajoutez le nouveau mot-clé.

0

La méthode ToString() est disponible pour tous les types dans .NET, car cette méthode est définie comme une méthode virtuelle dans la classe System.Object de base et tous les types héritent directement ou indirectement de System.Object. Si l'implémentation par défaut de la méthode ToString() ne remplit pas votre rôle, vous pouvez remplacer (utiliser le mot-clé override) ou masquer (utiliser le nouveau mot-clé).

Je suis venu à travers les éléments suivants 2 excellents articles expliquant les raisons de passer outre méthode ToString(), et la différence entre la clandestinité méthode et dominante de la méthode. Il y a aussi une vidéo sur youtube sur les mêmes concepts
Reason to override ToString()
Difference between method hiding and method overriding

Questions connexes