2009-06-18 11 views
17

Quiero redefinir la función ToString() en una de mis clases.C#: cadena pública pública ToString() VS cadena de anulación pública ToString()

escribí

public string ToString() 

... y está funcionando bien. Pero ReSharper me está diciendo que cambiar esto a cualquiera

public new string ToString() 

o

public override string ToString() 

Cuál es la diferencia? ¿Por qué C# requiere algo como esto?

+0

1 para deletrear su nombre de la forma ;-P sensato (y para que sea una pregunta razonable ...) –

Respuesta

32

Si usa public string ToString() no está claro lo que tenía previsto hacer. Si quiere cambiar el comportamiento de ToString a través del polimorfismo, entonces override. Usted podría agregar un new ToString(), pero eso sería una tontería. ¡No hagas eso!

La diferencia es lo que sucede cuando se hace:

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

Si override, tanto dará salida a su nueva versión. Si new, solo el primero usará su nueva versión; el segundo usará la implementación original.

no creo que he visto vez escondite método de utilización a nadie (también conocido como new) en ToString().

+1

Buen ejemplo de código. Estaba trabajando en algo similar. – RichardOD

+0

gracias, muy claro y útil – marcgg

+0

Desafortunadamente, he visto varios ejemplos de métodos escondidos en C#. Ninguno de ellos era bonito. – JaredPar

9

El problema es que ToString es un método virtual. Para anular un método virtual en C#, debe especificar la palabra clave de anulación.

Es casi seguro que no desea la "nueva" versión. .

1

C# no lo requiere; Resharper sí. Lo requiere porque las dos palabras clave representan un comportamiento significativamente diferente, y si no especifica, alguien que lea su código podría no estar del todo claro sobre cuál es el comportamiento predeterminado (es new).

En este caso, claramente desea para anular.

+1

En realidad, incluso sin R # recibirás una advertencia sobre esto. El * idioma * no lo exige, pero incluso el IDE "express" (gratuito) sabe que es una mala idea. –

+0

Otra razón por la que me gusta "Tratar las advertencias como errores" – lesscode

0

Lo que usted hace todo depende del comportamiento que desee. This article explica cómo funciona el comportamiento de ToString según cómo haya definido el método y en qué nivel de una jerarquía de clases llame a ToString.

4

El new modifier ocultará o "sombreará" al miembro con la misma firma en la clase base donde overriding proporciona una nueva implementación de un miembro heredado de una clase base. Aquí hay un good article sobre las diferencias entre sombreado y anulación.

0

Una recomendación personal de mi parte sería no usar el escondite; causa muchas ambigüedades y resuelve pocos.

1

ToString es un método virtual en la clase base. Para que el miembro actual anule esa implementación, agregue la palabra clave override. De lo contrario, agregue la nueva palabra clave. método

0

ToString() está disponible para cada tipo en .NET, ya que este método se define como un método virtual en la clase System.Object base, y todos los tipos heredan directa o indirectamente de System.Object. Si la implementación predeterminada del método ToString() no cumple con su propósito, es posible que desee anular (use la palabra clave override) u ocultar (usar palabra clave nueva).

Me he encontrado con los siguientes 2 excelentes artículos que explican las razones para anular el método ToString() y la diferencia entre la ocultación de métodos y la anulación de métodos. También hay un video de youtube en los mismos conceptos
Reason to override ToString()
Difference between method hiding and method overriding

Cuestiones relacionadas