Null-Bedingungsoperator, um die Existenz eines Array-Elements auf Null zu setzen

7

Der neue nullbedingte C # 6.0-Operator ist ein praktisches Hilfsmittel zum Schreiben von präziseren und weniger verschachtelten Codes. Angenommen, Sie haben ein Array von Kunden, dann könnten Sie null anstatt einer Länge erhalten, wenn customers null ist, indem Sie dies verwenden (Beispiele aus MSDN ):

%Vor%

In ähnlicher Weise könntest du null anstatt eines Kunden mit diesem erhalten:

%Vor%

Und für einen ausgefeilteren Ausdruck ergibt dies null, wenn customers null ist, der erste Kunde null ist oder das Objekt Orders des ersten Kunden null ist:

%Vor%

Aber dann gibt es den interessanten Fall des nicht existenten Kunden , den der Null-Bedingungs-Operator anscheinend nicht anspricht. Wir haben oben gesehen, dass ein null -Kunde abgedeckt ist, d. H. Wenn ein Eintrag im Array customers null ist. Aber das ist ziemlich verschieden von einem nicht existenten Kunden, z.B. Suchen Sie nach Kunden 5 in einem 3-Elemente-Array oder nach Kunden n in einer 0-Element-Liste. (Beachten Sie, dass die gleiche Diskussion auch für die Dictionary-Suche gilt.)

Mir scheint, dass der Null-bedingte Operator sich ausschließlich auf die Negation der Auswirkungen einer NullReferenceException konzentriert; IndexOutOfRangeException oder KeyNotFoundException sind allein, ausgesetzt, kauern in der Ecke und müssen für sich selbst sorgen! Ich behaupte, dass es im Geist des Null-bedingten Betreibers auch möglich sein sollte, mit diesen Fällen umzugehen ... was zu meiner Frage führt.

Habe ich es vermisst? Bietet die Null-Bedingung eine elegante Möglichkeit, diesen Ausdruck wirklich zu überdecken ...

%Vor%

... wenn es kein nulltes Element gibt?

    
Michael Sorens 05.05.2016, 00:31
quelle

3 Antworten

13

Nein, weil es ein null - bedingter Operator ist, kein indexoutofrange - Bedingungsoperator und ist lediglich syntaktischer Zucker für etwas wie das Folgende:

%Vor%

Sie können sehen, dass wenn Sie keinen nullten Kunden haben, Sie Ihre normale IndexOutOfRangeException bekommen.

Eine Möglichkeit, die Sie umgehen können, ist eine Erweiterungsmethode, die nach dem Index sucht und null zurückgibt, wenn sie nicht existiert:

%Vor%

Dann könnte Ihr Scheck sein:

%Vor%     
Steve 05.05.2016, 00:44
quelle
6
%Vor%

Kein Null, kein Problem.

    
Scott Hannen 05.05.2016 01:38
quelle
3

Es unterstützt keine Indexierungssicherheit, denn wenn man sich darauf beschränkt, ist ein Indexer wirklich nur syntaktischer Zucker für jede andere Art von Methode.

Zum Beispiel:

%Vor%

Soll das hier erwischt werden? Was wäre, wenn die Ausnahme sinnvoller wäre, ähnlich wie bei einer KeyNotFoundException, aber spezifisch für den Typ der Sammlung, die wir implementieren? Wir müssten die ?. -Funktionalität ständig aktualisieren, um Schritt zu halten.

Außerdem fängt ?. keine Ausnahmen ab. Es verhindert sie.

var customer = customers?[5]; wird tatsächlich wie folgt kompiliert:

%Vor%

Es wird außerordentlich schwierig, Ausnahmen zu machen. Zum Beispiel:

%Vor%

Wenn es nur Ausnahmen fangen würde, würde es geschrieben werden als:

%Vor%

Dies würde die Ausnahme innerhalb von FireSomeone und nicht die Nullreferenzausnahme, die geworfen würde, wenn Boss null wäre, abfangen.

Das gleiche Bad-Catch-Problem wäre vorhanden, wenn wir Index-Lookup-Exceptions, Schlüssel-Nicht-gefunden-Exceptions usw. abfangen würden.

    
Rob 05.05.2016 00:55
quelle