Während ich den Delegierten studierte, in dem es sich eigentlich um eine abstrakte Klasse handelt Delegate.cs
, sah ich die folgende Methode, die ich nicht verstehe
- Warum der Rückgabewert verwendet wird,
?
obwohl es sich bereits um einen Referenztyp ( Klassentyp ) handelt ?[]?
Bedeutung auf dem Parameter
Könntest du erklären?
public static Delegate? Combine(params Delegate?[]? delegates)
{
if (delegates == null || delegates.Length == 0)
return null;
Delegate? d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
d = Combine(d, delegates[i]);
return d;
}
c#
.net
null-coalescing-operator
nullable-reference-types
null-coalescing
snr - Monica wieder einsetzen
quelle
quelle
Antworten:
Schritt für Schritt Erklärung:
params Delegate?[] delegates
- Es ist ein Array von nullableDelegate
params Delegate?[]? delegates
- Das gesamte Array kann nullwertfähig seinDa jeder Parameter vom Typ ist
Delegate?
und Sie einen Index desDelegate?[]?
Arrays zurückgeben, ist es sinnvoll, dass der RückgabetypDelegate?
andernfalls vom Compiler einen Fehler zurückgegeben wird, als ob Sie ihn zurücksetzen würden, undint
von einer Methode, die eine Zeichenfolge zurückgibt.Sie können beispielsweise Ihren Code ändern, um einen
Delegate
Typ wie diesen zurückzugeben:quelle
?
obwohl er bereits Referenztyp (Klasse) ist?
aus genau demselben Grund, warum der Argumentwert das verwendet?
. Wenn Sie Letzteres verstehen, verstehen Sie Ersteres automatisch. Da die Methode möglicherweise null zurückgibt , akzeptiert der Parameter möglicherweise null . Das heißt, beide können null enthalten .Since each parameter is of the type Delegate? and you return an index of the Delegate?[]? array, then it makes sense that the return type is Delegate?
Foo?
hat eine ordentlicheHasValue
Eigenschaft,Foo
muss aber== null
überprüft werden. (4) Entwicklern, die die Methodensignatur lesen, wird mitgeteilt, dass Nullen ein mögliches, zu erwartendes und korrektes Ergebnis sind. (5) Der Code scheint von jemandem geschrieben worden zu sein, der ist sehr gern nullability und explizit darüber.Nullable Reference Types sind neu in C # 8.0 und existieren vorher nicht.
Es ist eine Frage der Dokumentation und wie Warnungen zur Kompilierungszeit erzeugt werden.
Die Ausnahme "Objekt nicht auf eine Instanz eines Objekts festgelegt" ist recht häufig. Dies ist jedoch eine Laufzeitausnahme, die teilweise bereits zur Kompilierungszeit erkannt werden kann.
Für eine Regelung können
Delegate d
Sie jederzeit anrufenDas heißt, Sie können es codieren, zur Kompilierungszeit wird nichts passieren. Zur Laufzeit können Ausnahmen ausgelöst werden.
Während für einen neuen
Delegate? p
dieser Codeerzeugt eine Compiler-Warnung.
CS8602: Dereference of a possibly null reference
es sei denn, Sie schreiben:Was bedeutet, rufen Sie nur an, wenn nicht null.
Sie dokumentieren also, dass eine Variable null enthalten kann oder nicht. Es löst früher Warnungen aus und kann mehrere Tests für null vermeiden. Das gleiche was du für int und int hast?. Sie wissen sicher, dass einer nicht null ist - und Sie wissen, wie man einen in den anderen konvertiert.
quelle
Delegate
das nicht null ist. Sie tun einfach so, als ob Sie es sicher wissen (was in den meisten Fällen gut genug ist).int
, kann es nie null sein. Wenn Sie eine habenDelegate
, kann sie null sein (aus verschiedenen Gründen, z. B. Reflexion). Es ist normalerweise sicher anzunehmen, dassDelegate
(in C # 8 mit aktiviertem NRT) nicht null ist, aber Sie wissen es nie genau (woint
wir es sicher wissen).In C # 8 sollte man Referenztypen explizit als nullbar markieren.
Standardmäßig können diese Typen keine Null enthalten, ähnlich wie Werttypen. Dies ändert zwar nichts an der Funktionsweise unter der Haube, bei der Typprüfung müssen Sie dies jedoch manuell tun.
Der angegebene Code wurde für die Verwendung mit C # 8 überarbeitet, profitiert jedoch nicht von dieser neuen Funktion.
Hier ist ein Beispiel für einen aktualisierten Code (funktioniert nicht, nur eine Idee), der diese Funktion nutzt. Es hat uns vor einer Nullprüfung bewahrt und diese Methode ein wenig vereinfacht.
quelle
those types are not able to contain null
Beachten Sie, dass eine Compiler- Warnung und kein Fehler generiert wird. Der Code läuft einwandfrei (obwohl er möglicherweise NullReferenceExceptions generiert). Dies erfolgt unter Berücksichtigung der Abwärtskompatibilität.