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>();
War es hilfreich?

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 tun
private 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top