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.
@devoured yep - solo eso. –
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
Corrección: C# no te permitirá hacerlo. – Noldorin