Ich habe einen asynchronen Code, zu dem ich einen hinzufügen möchte CancellationToken
. Es gibt jedoch viele Implementierungen, bei denen dies nicht erforderlich ist, sodass ich einen Standardparameter haben möchte - vielleicht CancellationToken.None
. Jedoch,
Task<x> DoStuff(...., CancellationToken ct = null)
ergibt
Ein Wert vom Typ '' kann nicht als Standardparameter verwendet werden, da keine Standardkonvertierungen für den Typ 'System.Threading.CancellationToken' vorhanden sind.
und
Task<x> DoStuff(...., CancellationToken ct = CancellationToken.None)
Der Standardparameterwert für 'ct' muss eine Konstante zur Kompilierungszeit sein
Gibt es eine Möglichkeit, einen Standardwert für CancellationToken
festzulegen?
CancellationToken.None
etwas mehr als wirddefault(CancellationToken)
.default(CancellationToken)
tun?CancellationToken.None
dass sie de facto veraltet sind. Sogar Microsoft verwendetdefault(CancellationToken)
stattdessen. Sehen Sie sich beispielsweise diese Suchergebnisse aus dem Quellcode des Entity Framework an.Dies ist leider nicht möglich, da
CancellationToken.None
es sich nicht um eine Kompilierungszeitkonstante handelt, die für Standardwerte in optionalen Argumenten erforderlich ist.Sie können den gleichen Effekt erzielen, indem Sie eine überladene Methode erstellen, anstatt zu versuchen, Standardparameter zu verwenden:
quelle
CancellationToken cancellationToken = default(CancellationToken)
? Auch hier beschrieben blogs.msdn.microsoft.com/andrewarnottms/2014/03/19/…Hier sind mehrere Lösungen in absteigender Reihenfolge der allgemeinen Güte:
1.
default(CancellationToken)
Als Standardwert verwenden:Semantisch
CancellationToken.None
wäre dies der ideale Kandidat für die Standardeinstellung, kann jedoch nicht als solcher verwendet werden, da es sich nicht um eine Konstante für die Kompilierungszeit handelt.default(CancellationToken)
ist das nächstbeste, da es sich um eine Konstante zur Kompilierungszeit handelt, die offiziell als gleichwertig dokumentiert istCancellationToken.None
.2. Bereitstellung einer Methodenüberladung ohne
CancellationToken
Parameter:Oder wenn Sie Methodenüberladungen gegenüber optionalen Parametern bevorzugen (siehe diese und diese Frage zu diesem Thema):
Für Schnittstellenmethoden kann dasselbe mit Erweiterungsmethoden erreicht werden:
Dies führt zu einer schlankeren Benutzeroberfläche und erspart Implementierern das explizite Schreiben der Überladung der Weiterleitungsmethode.
3. Den Parameter auf Null setzen und
null
als Standardwert verwenden:Diese Lösung gefällt mir am wenigsten, weil nullfähige Typen mit einem geringen Laufzeitaufwand verbunden sind und Verweise auf das Lösch-Token aufgrund des Null-Koaleszenz-Operators ausführlicher werden
??
.quelle
Eine andere Möglichkeit besteht darin, einen
Nullable<CancellationToken>
Parameter zu verwenden, ihn standardmäßig zu verwendennull
und ihn innerhalb der Methode zu behandeln:quelle
Neuere Versionen von C # ermöglichen eine vereinfachte Syntax für die Standardversion (CancellationToken). Z.B:
quelle
Tofutims Antwort ist eine Möglichkeit, aber aus den Kommentaren geht hervor, dass die Leute Probleme damit haben.
In diesem Fall habe ich vorgeschlagen, dass man eine Methode wie folgt haben kann:
und überladen Sie es als:
Dies wird kompiliert, da der Wert von
CancellationToken.None
zur Kompilierungszeit nicht erforderlich ist.quelle