Was denken Sie über ?? = Operator in C #? [geschlossen]
-
23-09-2019 - |
Frage
Glauben Sie, dass C # etwas wie ?? = Operator unterstützen?
Anstelle dieser:
if (list == null)
list = new List<int>();
Es könnte möglich sein, zu schreiben:
list ??= new List<int>();
Nun könnte ich (aber es scheint mir nicht gut lesbar):
list = list ?? new List<int>();
Lösung
Ich habe immer so etwas wie dies will. Ich würde es weit mehr verwendet oft als die ??
von selbst aus.
Was ich wirklich will, obwohl, ist eine Form des Operators, der Sie nur, wenn nicht null das Objekt dereferenzieren kann. So ersetzen Sie diese:
int count = (list != null)? list.Count : 0
mit so etwas wie folgt aus:
int count = list??.Count : 0
Welche besonders nützlich für mich, mit langen Ketten von Referenzen (schlechtem Design, ich weiß) sein würden, aber zum Beispiel
int count = foo??.bar??.baz??.list??.Count : 0
Dies ist derzeit nicht möglich, mit ??
, weil Sie nur „assign zu foo, oder eine Alternative, wenn null“ sagen können, aber nicht „assign zu einer Eigenschaft von foo oder einer Alternative, wenn null. „
Andere Tipps
Ich persönlich denke, nur die zweite Erweiterung sinnvoll ist (in Bezug auf die Führung entlang der gleichen Linie wie +=
etc.):
list = list ?? new List<int>();
aber um ehrlich zu sein ich es ein wenig finden bisschen unnötig. Menschen in der Regel "get" i += 5;
, sondern neigen dazu, ein Problem mit null-Koaleszenz (??
) zu haben. Fügen Sie einen Null-Koaleszenz-Zuweisungsoperator und ... na ja, ich sehe nicht, es endet gut.
Persönlich favorisieren ich den ursprünglichen Code:
if(list == null) { list = new List<int>(); }
....
Auch - betrachten: in allen anderen +=
, -=
etc - die rechte Seite wird immer ausgewertet. In diesem Fall wäre es nicht (in einigen Fällen) sein. Das bringt noch mehr Verwirrung. Und damit meine ich:
i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?
Ein Trick, den ich irgendwo hier auf Stackoverflow gefunden war so etwas wie dieses ...
zu tunprivate List<string> myList;
public List<string> MyProp
{
get { return myList ?? (myList= new List<string>()); }
}
... Sie vielleicht in der Lage ähnlich faul eval in Ihrem Code zu verwenden.
Ich mag es - es ist eine schöne, prägnante Art und Weise einen faulen Lade Ausdruck auszudrücken. Unabhängig davon, ob es wird hinzugefügt, um die Sprache ist eine ganz andere Sache - wie
Wenn ich Ihre Frage falsch gelesen, das tut Operator exist in C #: http://msdn.microsoft.com/en-us/library/ms173224 (VS.80) aspx