2009-09-20 14 views

Respuesta

20

Es un viejo hábito para evitar el error tipográfico accidental de myVar = null (whoops). Todavía es útil en algunos idiomas, pero C# lo protegerá de hacerlo, por lo que no es necesario.

+0

@devoured yep - solo eso. –

+0

Además, es un hábito general de decir "someConst == myVar", donde someConst resulta ser nulo en este caso. Algunos lenguajes de scripting pueden traducir lo anterior como "someConst.equals (myVar)", y si lo haces al revés, puedes obtener un NPE. – Bugmaster

+0

Corrección: C# no te permitirá hacerlo. – Noldorin

8

Es un vestigio de C, donde los compiladores de más edad no atrapar a este:

if (foo = null) 

cuando quiere decir esto:

if (foo == null) 

El ejemplo broma clásica es este error:

if (fireTheNukes = true) 
    fireTheNukes(); 

Esto generalmente se acepta como un patrón arcaico ya que cualquier compilador que se precie tendrá una tarea dentro una declaración condicional. Evitaría este patrón en tu código ya que no sirve para nada en estos días.

+0

@Andrew: Pensé que if (foo = null) era una afirmación perfectamente válida (asigna el valor a foo y luego verifica si es verdadero). No pensé que tuviera nada que ver con los compiladores que no "atraparon". –

+0

@Esteban - ¿qué lenguaje y compilador?Mientras que el compilador C# _permitirá una asignación booleana en una declaración condicional, también generará un "¿realmente quisiste hacer esto?" advertencia. –

2

Es un viejo hábito defensivo. Si coloca la constante a la izquierda, olvidar el segundo signo igual da como resultado un error de compilación. En el formato más normal, olvidar el segundo signo igual da como resultado la asignación de nulo a su variable.

En otras palabras,

myVar = null 

es perjudicial y sorprendente, mientras que

null = myVar 

queda atrapado por el compilador.

2

Es un hábito de los programadores C, uno que se ha llevado a C# en este caso, pero de hecho es totalmente innecesario.

Considere en C que si accidentalmente escribe if (myVar = null), el compilador hará la tarea y no se quejará. Si se cambia el orden de myVar y null, se genera un error de compilación si == se escribe mal accidentalmente como =. C#, sin embargo, genera una advertencia de compilación en cualquier caso, por lo que esta peculiaridad es innecesaria.

2

Viene de C/C++ para atrapar dejando fuera uno signo igual:

myVar = null 

Pero no es necesario en C#.

1

Como han mencionado otros, es una táctica defensiva contra los problemas que pueden surgir del hecho de que en C y algunas derivadas C (incluyendo C#) una expresión de asignación evalúa el valor de esa asignación.Esto es lo que le permite hacer:

if (a = true) { /* This will always get done, as "a = true" evals to true */ } 

y

int a = b = c = d = 10; 

Como asignación es asociativa bien esta es efectivamente

int a = (b = (c = (d = 10))); 

donde cada expresión dentro de un par corsé evaluará al valor de la asignación, que en este caso es 10 y a, b, c y d, todos serán 10.

Para evitar posibles errores, al mezclar los operadores de asignación e igualdad, algunos programadores prefieren poner siempre la constante a la izquierda, ya que si el operador de asignación se utiliza accidentalmente, el compilador se quejará de que no se puede asignar a una constante.

Esto es, sin embargo, un problema menor en C# por dos razones. En primer lugar, a diferencia de C, C# no permite interpretar los valores arbitrarios como un valor booleano.

Esto era necesario en C porque no tenía un tipo de booleano verdadero, simplemente se basaba en la interpretación de otros valores como enteros (donde 0 es falso y no cero es verdadero) o punteros (donde NULL es falso). Esto significaba que entonces podría hacer algo como

if (10) { /* This will always get done */ } 
if (0) { /* This will never get done */ } 
if (p) { /* This will get done is p is not null */ } 
if (NULL) { /* This will never get done */ } 

Sin embargo, debido a que C# no permite expresiones arbitrarias a ser interpretados como un valor lógico éstos no funcionarán en C#. También significa que

if (a = 10) { } 

no se compilará en C#, como la expresión "a = 10" se evalúa como el valor de la expresión, 10, que no puede entonces ser interpretado como el valor booleano es necesario.

La segunda razón por la cual es un problema menor es que en el porcentaje, ahora mucho más pequeño, de casos en los que el resultado de la tarea se puede interpretar como un valor booleano, el compilador emite una advertencia para asegurarse de que realmente Para hacer eso.

La advertencia se puede suprimir con

#pragma warning disable 665 

Sin embargo, la presencia de dicho código es a menudo un mal olor de código y es probablemente el mejor tratados por la refactorización para hacer el código más claro.

Cuestiones relacionadas