2008-09-16 10 views
9

Tengo una función que toma, entre otros, un parámetro declarado como int privateCount. Cuando deseo llamar a ToString() en este parámetro, ReSharper lo atenúa y lo marca como una llamada redundante. Entonces, curioso como soy, elimino el ToString(), ¡y el código aún se construye!Llamada redundante a Object.ToString()

¿Cómo puede un compilador C# permitir esto, donde str es una cadena?

str += privateCount + ...

Respuesta

18

El operador + para la cadena está sobrecargado para llamar String.Concat que pasa en el lado izquierdo y derecho de la expresión. Así:

string x = "123" + 45; 

se compila a:

String.Concat("123", 45); 

Desde String.Concat realiza en dos objetos, el lado de la mano derecha (45) está en un recuadro y luego se llama ToString() en él.

Tenga en cuenta que esta "sobrecarga" no es a través de la sobrecarga del operador en el idioma (también conocido como no es un método llamado op_Addition) sino que es manejado por el compilador.

2

C# convierte automáticamente los objetos en cadenas para usted. Considere esta línea de código:

aString = aString + 23; 

Esto es válido C#; se compila como una llamada a String.Concat(), que toma dos objetos como argumentos. Esos objetos se convierten automáticamente en objetos de cadena por usted.

Lo mismo ocurre cuando se escribe:

aString += 23; 

De nuevo, esto se compila a la misma llamada a String.Concat(); está escrito de manera diferente.

2

Esta es una mala práctica válida, ya que debe pensar dos veces si la variable es una cadena o un int. ¿Qué pasa si la variable se llamará myInt?

myInt = myInt + 23; 

es más legible y comprensible de esta forma?

myInt = mInt + "23"; 

o incluso:

myInt = string.Format("{0}{1}", myInt, 23); 

Sabemos por el código que se trata de una cadena y no es un entero.

8

No es solo una mala práctica, sino también un rendimiento menor: el número entero tiene que estar encuadrado porque String.Concat expectes un objeto mientras que int.ToString() no requiere boxeo.

+0

¿Mide usted realmente la diferencia de rendimiento? –

+5

Jeffrey Richter escribió sobre esto en su famoso libro "CLR via C#" (página 135f). –

+1

Pero esto plantea una pregunta. Si es mala práctica y menos rendimiento, ¿por qué ReSharper lo recomienda? – Rolf

Cuestiones relacionadas