Que pensez-vous ?? = opérateur en C #? [fermé]
-
23-09-2019 - |
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>();
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
À moins que je lis votre mauvaise question, que l'opérateur existe en C #: http://msdn.microsoft.com/en-us/library/ms173224 (VS.80) .aspx