2010-02-24 12 views
7

Todo el mundo sabe, al menos, dos # modismos común c, incluyendo el operador se unen:Común expresiones idiomáticas c incluyendo fusionarse ?? operador

un singleton uno:

return _staticField = _staticField ?? new SingletonConstructor(); 

y una cadena de uno:

notNullableResult = nullable1 ?? nullable2 ?? nullable3 ?? default(someType); 

es legible, coherente, vale la pena utilizar y reconocible en el código.

Pero, desafortunadamente, esto es todo. Algunas veces necesitará expandirse o cambiarse. A veces los uso cuando veo un caso particular, y siempre dudo en usarlo porque no sé si algún otro programador realmente lo leerá fácil.

¿Conoces algún otro? Me encantaría tener usos más específicos: p. Asp.net, EF, LINQ, cualquier cosa, donde fusionarse no solo es aceptable sino notable.

+1

Me parece que todos los usos del operador coalescente nula son sólo casos especiales de su " cadena uno ". –

+0

todavía, todos los casos son más o menos especiales o generales. para mí, el arte de la programación es equilibrar y sentir la diferencia. coalesce es un caso especial de la declaración 'if', ¿no es así? y el interruptor - la caja es especial, ¿y qué? ¿eliminarlos? – rudnev

+1

No es así como se implementa un singleton instanciado perezosamente. Incluso si acaba de dejar fuera un bloque 'lock' en aras de la brevedad en esta pregunta, solo sirve para ofuscar el código. – Aaronaught

Respuesta

6

Para mí, donde se traduce a SQL es suficiente por sí misma:

from a in DB.Table 
select new { 
      a.Id, 
      Val = a.One ?? a.Two ??a.Three 
      } 

Esto resulta en COALSCE en el lado de la base de datos hace que para tremendamente SQL más limpio en la mayoría de los casos, simplemente no hay ninguna gran alternativa Estamos usando Oracle, prefiero no leer Nvl(Nvl(Nvl(Nvl( anidando gracias ... Tomaré mi COALSCE y correré con él.

También lo uso de inmuebles como este, sólo un gusto personal, supongo:

private string _str; 
public string Str { 
    get { return _str ?? (_str = LoaderThingyMethod()); } 
} 
4

La razón de que el operador nulo coalescencia se ha introducido en C# 2.0 era tener una forma de asignar valores por defecto para nullable types y así convertir fácilmente un tipo que admite nulos en un tipo que no admite nulos. Sin ??, cualquier conversión requeriría una declaración larga if. La siguiente cita se toma de MSDN:

Un tipo anulable puede contener un valor, o puede ser indefinido. Los ?? El operador define que se devuelva el valor predeterminado cuando un tipo anulable es asignado a un tipo que no admite nulos. Si intenta asignar un tipo de valor que admite nulos a un tipo de valor que no admite nulos sin usar el ?? operador, generará un error en tiempo de compilación. Si usa un molde, y el tipo de valor que admite nulos no está definido actualmente, se lanzará una excepción InvalidOperationException .

Usted podría considerar la siguiente simplificación "notable":

int? x = null; 
int y = x ?? -1; 

En lugar de

int? x = null; 
int y = -1; 

if (x.HasValue) 
{ 
    y = x.Value; 
} 
+0

sí, debería haber especificado que una cadena suele ser nulables. gracias. – rudnev

+0

El operador coalescente nulo se introdujo realmente en C# 2.0, no en 3.0 (lo mismo que los tipos que aceptan nulos) –

+0

@Thomas Levesque: Tiene razón, estoy corregido. –

Cuestiones relacionadas