2009-06-18 15 views
17

Desidero ridefinire la funzione ToString() in una delle mie classi.C#: public nuova stringa ToString() VS stringa di override pubblica ToString()

ho scritto

public string ToString() 

... e che sta funzionando benissimo. Ma ReSharper mi sta dicendo di cambiare questo a uno

public new string ToString() 

o

public override string ToString() 

Qual è la differenza? Perché C# richiede qualcosa di simile?

+0

+1 per la compitazione il tuo nome il modo ;-p sensibile (e al fatto che è una domanda ragionevole ...) –

risposta

32

Se si utilizza public string ToString() non è chiaro cosa si intende fare . Se si intende modificare il comportamento di ToString tramite il polimorfismo, quindi override. È possibile aggiungere un new ToString(), ma sarebbe sciocco. Non farlo!

La differenza è ciò che accade quando si esegue:

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

Se override, sia in uscita volontà la nuova versione. Se si new, solo il primo utilizzerà la nuova versione; il secondo utilizzerà l'implementazione originale.

Io non credo di aver mai visto utilizzare il metodo nessuno nascondiglio (aka new) su ToString().

+1

Esempio di codice piacevole. Stavo lavorando a qualcosa di simile. – RichardOD

+0

grazie, molto chiaro e utile – marcgg

+0

Purtroppo ho visto diversi esempi di metodo nascosto in C#. Nessuno di loro era carino. – JaredPar

9

Il problema è che ToString è un metodo virtuale. Per sovrascrivere un metodo virtuale in C# è necessario specificare la parola chiave override.

Quasi certamente non si desidera la "nuova" versione. .

1

C# non lo richiede; Fa Resharper. Lo richiede perché le due parole chiave rappresentano un comportamento significativamente diverso e se non lo si specifica, qualcuno che legge il codice potrebbe non essere del tutto chiaro su quale comportamento predefinito è (è new).

In questo caso si desidera chiaramente per sovrascrivere.

+1

In realtà, anche senza R # riceverai un avvertimento su questo. Il * linguaggio * non lo richiede, ma anche l'IDE "libero" (libero) sa che è una cattiva idea. –

+0

Un altro motivo per cui mi piace "Considera gli avvisi come errori" – lesscode

0

Quello che fai tutto dipende dal comportamento che desideri. This article spiega come funziona il comportamento di ToString in base a come è stato definito il metodo e a quale livello in una gerarchia di classi viene richiamato ToString.

4

Il new modifier nasconde o "ombreggia" il membro con la stessa firma nella classe base dove come overriding fornisce una nuova implementazione di un membro ereditato da una classe di base. Ecco uno good article sulle differenze tra shadowing e overriding.

0

Una mia raccomandazione personale sarebbe quella di non usare il nascondiglio; causa molte ambiguità e risolve pochi.

1

ToString è un metodo virtuale nella classe base. Per fare in modo che il membro corrente ignori tale implementazione, aggiungi la parola chiave override. Altrimenti aggiungi la nuova parola chiave. Metodo

0

ToString() è disponibile per ogni tipo NET, in quanto questo metodo è definito come un metodo virtuale nella classe base System.Object, e tutti i tipi direttamente o indirettamente eredita da System.Object. Se l'implementazione predefinita del metodo ToString() non gestisce il tuo scopo, potresti voler sostituire (usare la parola chiave override) o nascondere (usa la nuova parola chiave).

Mi sono imbattuto nei seguenti 2 articoli eccellenti che spiegano i motivi per l'override del metodo ToString() e la differenza tra l'occultamento del metodo e l'override del metodo. C'è anche un video di youtube sugli stessi concetti
Reason to override ToString()
Difference between method hiding and method overriding

Problemi correlati