2010-02-24 5 views
7

Tout le monde connaît au moins deux idiomes C# commun y compris l'opérateur soudent:idiomes de C# communs, y compris coalesce ?? opérateur

un singleton un:

return _staticField = _staticField ?? new SingletonConstructor(); 

et une chaîne un:

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

il est lisible, cohérente, d'une valeur à l'aide et reconnaissable dans le code.

Mais, malheureusement, c'est tout. Parfois, il faudra élargir ou modifier. Parfois je les utilise quand je vois un cas particulier - et toujours j'hésite à l'employer parce que je ne sais pas si n'importe quel autre programmeur le lira vraiment facile.

Connaissez-vous d'autres personnes? J'aimerais avoir des usages plus spécifiques: par ex. Asp.net, EF, LINQ, n'importe quoi - où la fusion est non seulement acceptable mais remarquable.

+1

Il me semble que toutes les utilisations de l'opérateur coalescent nul ne sont que des cas particuliers de votre " chaîne un ". –

+0

toujours, tous les cas sont plus ou moins spéciaux ou généraux. pour moi, l'art de la programmation est d'équilibrer et de sentir la différence. coalesce est un cas particulier de 'if', n'est-ce pas? et switch-case est un spécial, alors quoi - pour les supprimer? – rudnev

+1

Ce n'est pas comme ça que vous implémentez un singleton instancié paresseusement. Même si vous avez omis un bloc 'lock' pour des raisons de brièveté dans cette question, cela ne sert qu'à masquer le code. – Aaronaught

Répondre

6

Pour moi, où il se traduit par SQL est assez bon par lui-même:

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

Ce résultat COALSCE du côté de la base de données fait pour énormément SQL propre dans la plupart des cas, il est tout simplement pas excellente alternative. Nous utilisons Oracle, je préfère ne pas lire si Nvl(Nvl(Nvl(Nvl( nichement merci ... Je vais prendre mon COALSCE et courir avec elle.

Je l'utilise aussi pour des propriétés comme celle-ci, juste goût je suppose:

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

La raison pour laquelle l'opérateur nul-coalescent a été introduit en C# 2.0 était d'avoir un moyen d'attribuer des valeurs par défaut nullable types et ainsi facilement convertir un type Nullable en un type non nullable. Sans ??, toute conversion nécessiterait une longue instruction if. La citation suivante est tirée de MSDN:

Un type Nullable peut contenir une valeur, ou il peut être défini. Le ?? L'opérateur définit la valeur par défaut être renvoyé lorsqu'un type NULL est affecté à un type non nullable. Si vous essayez d'affecter une valeur Null tapez à un type de valeur non-nullable sans utiliser le ?? opérateur, vous va générer une erreur de compilation. Si vous utilisez un cast, et la valeur NULL type est actuellement indéfini, une exception InvalidOperationException sera levée.

Vous pourriez envisager la simplification suivante « remarquable »:

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

Au lieu de

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

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

oui, j'aurais dû préciser qu'une chaîne est généralement à propos de nullables. Je vous remercie. – rudnev

+0

L'opérateur de coalescence null a été réellement introduit dans C# 2.0, pas 3.0 (même que les types nullable) –

+0

@ Thomas Levesque: Vous avez raison, je suis corrigé. –