173 votes

Moyens uniques d’utiliser l’opérateur de fusion Null

Je sais que le niveau moyen de l'aide de l'Null coalescence opérateur en C# est de définir des valeurs par défaut.

string nobody = null;
string somebody = "Bob Saget";
string anybody = "";

anybody = nobody   ?? "Mr. T"; // returns Mr. T
anybody = somebody ?? "Mr. T"; // returns "Bob Saget"

Mais quoi d'autre pouvez - ?? il être utilisé? Il ne semble pas aussi utile que l'opérateur ternaire, en plus d'être plus concis et plus facile à lire que:

nobody = null;
anybody = nobody == null ? "Bob Saget" : nobody; // returns Bob Saget

Donc, étant donné que le nombre même de connaître, null coalescence opérateur...

  • Avez-vous utilisé ?? pour autre chose?

  • Est - ?? nécessaire, ou si vous utilisez l'opérateur ternaire (qui la plupart sont familiers avec)

227voto

James Curran Points 55356

Eh bien, tout d'abord, il est beaucoup plus facile d'enchaîner que le standard ternaire:

 string anybody = parm1 ?? localDefault ?? globalDefault;
 

contre.

 string anyboby = (parm1 != null) ? parm1 
               : ((localDefault != null) ? localDefault 
               : globalDefault);
 

Cela fonctionne aussi bien si l'objet null-possible n'est pas une variable:

 string anybody = Parameters["Name"] 
              ?? Settings["Name"] 
              ?? GlobalSetting["Name"];
 

contre.

 string anybody = (Parameters["Name"] != null ? Parameters["Name"] 
                 : (Settings["Name"] != null) ? Settings["Name"]
                 :  GlobalSetting["Name"];
 

179voto

Cristian Libardo Points 7425

Je l'ai utilisé comme un one-liner paresseux:

 public MyClass LazyProp
{
    get { return lazyField ?? (lazyField = new MyClass()); }
}
 

Lisible? Décider vous-même.

53voto

Jon Skeet Points 692016

J'ai trouvé utile dans les deux "un peu étrange" manières:

  • Comme une alternative pour avoir un out paramètre lors de l'écriture d' TryParse des routines (c'est à dire renvoie la valeur null si l'analyse échoue)
  • En tant que "ne sait pas" représentation pour les comparaisons

Ce dernier a besoin d'un peu plus d'information. En général, lorsque vous créez une comparaison avec plusieurs éléments, vous avez besoin de voir si la première partie de la comparaison (l'âge par exemple) donne une réponse définitive, puis la prochaine partie (par exemple, nom) seulement si la première partie n'a pas aidé. En utilisant le nul de la coalescence de l'opérateur signifie que vous pouvez écrire assez simple comparaisons (que ce soit pour commander ou d'égalité). Par exemple, à l'aide d'un couple de classes d'assistance dans MiscUtil:

public int Compare(Person p1, Person p2)
{
    return PartialComparer.Compare(p1.Age, p2.Age)
        ?? PartialComparer.Compare(p1.Name, p2.Name)
        ?? PartialComparer.Compare(p1.Salary, p2.Salary)
        ?? 0;
}

Certes, j'ai maintenant ProjectionComparer dans MiscUtil, avec quelques extensions, qui font de ce genre de chose encore plus facile - mais c'est toujours soignée.

La même chose peut être fait pour la vérification de référence de l'égalité (ou de nullité) au début de la mise en œuvre d'égal à Égal.

15voto

Ryan Points 986

Le plus grand avantage que je trouve à l'opérateur ?? est que vous pouvez facilement convertir les types de valeurs nullables en types non nullables:

 int? test = null;
var result = test ?? 0; // result is int, not int?
 

Je l'utilise souvent dans les requêtes Linq:

 Dictionary<int, int?> PurchaseQuantities;
// PurchaseQuantities populated via ASP .NET MVC form.
var totalPurchased = PurchaseQuantities.Sum(kvp => kvp.Value ?? 0);
// totalPurchased is int, not int?
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X