Question

Pensez-vous que C # soutiendra quelque chose comme ?? opérateur =?

Au lieu de ceci:

if (list == null)
  list = new List<int>();

Il est peut-être possible d'écrire:

list ??= new List<int>();

Maintenant, je pourrais utiliser (mais il me semble pas bien lisible):

list = list ?? new List<int>();
Était-ce utile?

La solution

Je l'ai toujours voulu quelque chose comme ça. Je l'utiliser beaucoup plus souvent que la ?? par lui-même.

Ce que je veux vraiment, cependant, est une forme de l'opérateur qui vous permet de déréférencer l'objet que si non nul. Pour remplacer:

    int count = (list != null)? list.Count : 0

avec quelque chose comme ceci:

    int count = list??.Count : 0

Ce qui serait particulièrement utile pour moi de longues chaînes de références (mauvaise conception, je sais), mais par exemple

    int count = foo??.bar??.baz??.list??.Count : 0

Ce n'est pas possible actuellement avec ?? parce que vous ne pouvez dire « attribuer à toto, ou une alternative si nulle » mais pas « céder à propriété de foo, ou une alternative si nulle. «

Autres conseils

Personnellement, je pense que la deuxième extension est logique (en termes de maintien le long de la même ligne que += etc.):

list = list ?? new List<int>();

mais pour être honnête, je trouve un peu inutile. Habituellement, les gens « get » i += 5;, mais ont tendance à avoir un problème avec null coalescent (??). Ajouter un opérateur nul-coalescent missions et ... eh bien, je ne vois pas bien finir.

Personnellement, je préfère le code d'origine:

if(list == null) { list = new List<int>(); }
....

En outre - considérer: dans tous les autres +=, -= etc - le côté droit est toujours évaluée. Dans ce cas, il ne serait pas (dans certains cas). Cela ajoute encore plus de confusion. Je veux dire:

i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?

Un truc que je trouve quelque part ici sur stackoverflow était de faire quelque chose comme ça ...

private List<string> myList;
public List<string> MyProp 
{
    get { return myList ?? (myList= new List<string>()); }
}

... peut-être vous en mesure d'utiliser eval paresseux similaire dans votre code.

Je l'aime - c'est une façon agréable, concise pour exprimer une expression de chargement paresseux. Si oui ou non il est ajouté à la langue est tout à fait autre chose - comme

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top