Stark typisierte DelegateStrongly Typed Delegates

VorherigesPrevious

Im vorherigen Artikel haben Sie gesehen, dass bestimmte Delegaten mithilfe des delegate-Schlüsselworts erstellen.In the previous article, you saw that you create specific delegate types using the delegate keyword.

Die abstrakte Klasse für den Delegaten stellt die Infrastruktur für die lose Kopplung und den losen Aufruf bereit.The abstract Delegate class provide the infrastructure for loose coupling and invocation. Konkrete Delegattypen werden durch die Einführung und das Erzwingen von Typsicherheit für die Methoden, die zur Aufrufliste für ein Delegatobjekt hinzugefügt werden, viel nützlicher.Concrete Delegate types become much more useful by embracing and enforcing type safety for the methods that are added to the invocation list for a delegate object. Wenn Sie das delegate-Schlüsselwort verwenden und einen konkreten Delegattyp definieren, generiert der Compiler diese Methoden.When you use the delegate keyword and define a concrete delegate type, the compiler generates those methods.

In der Praxis würde dies zur Erstellung neuer Delegattypen führen, wann immer Sie eine andere Methodensignatur benötigen.In practice, this would lead to creating new delegate types whenever you need a different method signature. Diese Arbeit könnte mit der Zeit ermüdend werden.This work could get tedious after a time. Jede neue Funktion erfordert neue Delegattypen.Every new feature requires new delegate types.

Glücklicherweise ist dies nicht erforderlich.Thankfully, this isn't necessary. Der .NET Core Framework enthält verschiedene Typen, die Sie wiederverwenden können, wenn Sie Delegattypen benötigen.The .NET Core framework contains several types that you can reuse whenever you need delegate types. Dies sind generische Definitionen, damit Sie Anpassungen deklarieren können, wenn Sie neue Methodendeklarationen benötigen.These are generic definitions so you can declare customizations when you need new method declarations.

Der erste dieser Typen ist der Action-Typ, und verschiedene Varianten:The first of these types is the Action type, and several variations:

public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
// Other variations removed for brevity.

Die in-Modifizierer im generischen Typargument wird in diesem Artikel in Kovarianz behandelt.The in modifier on the generic type argument is covered in the article on covariance.

Es gibt Variationen der Action Delegat, der bis zu 16 Argumente enthalten, wie z. B. Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>.There are variations of the Action delegate that contain up to 16 arguments such as Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>. Es ist wichtig, dass diese Definitionen andere generische Argumente für jeden der Delegatargumente verwenden: Das bietet Ihnen maximale Flexibilität.It's important that these definitions use different generic arguments for each of the delegate arguments: That gives you maximum flexibility. Die Methodenargumente müssen nicht, aber können der gleiche Typ sein.The method arguments need not be, but may be, the same type.

Verwenden Sie einen der Action-Typen für jeden Delegattyp, der über einen void-Rückgabetyp verfügt.Use one of the Action types for any delegate type that has a void return type.

Das Framework enthält auch mehrere generische Delegattypen, die Sie für Delegattypen verwenden können, die Werte zurückgeben:The framework also includes several generic delegate types that you can use for delegate types that return values:

public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, out TResult>(T1 arg);
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
// Other variations removed for brevity

Der out-Modifizierer im Ergebnisargument des generischen Typs wird in diesem Artikel in Kovarianz behandelt.The out modifier on the result generic type argument is covered in the article on covariance.

Es gibt Variationen der Func wie z. B. mit bis zu 16 Eingabeargumente Delegieren Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>.There are variations of the Func delegate with up to 16 input arguments such as Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>. Der Typ des Ergebnisses ist immer der letzte Typparameter in allen Func-Deklarationen, gemäß der Konvention.The type of the result is always the last type parameter in all the Func declarations, by convention.

Verwenden Sie einen der Func-Typen für jeden Delegattyp, der einen Wert zurückgibt.Use one of the Func types for any delegate type that returns a value.

Es ist auch ein spezieller Predicate<T> Typ für einen Delegaten, der einen Test auf einen einzelnen Wert zurückgibt:There's also a specialized Predicate<T> type for a delegate that returns a test on a single value:

public delegate bool Predicate<in T>(T obj);

Möglicherweise haben Sie bemerkt, dass für jeden Predicate-Typ ein strukturell äquivalenter Func-Typ vorhanden ist, beispielsweise:You may notice that for any Predicate type, a structurally equivalent Func type exists For example:

Func<string, bool> TestForString;
Predicate<string> AnotherTestForString;

Sie denken möglicherweise, dass diese beiden Typen äquivalent sind.You might think these two types are equivalent. Das sind sie nicht.They are not. Diese beiden Variablen sind nicht austauschbar.These two variables cannot be used interchangeably. Eine Variable eines Typs kann dem anderen Typ nicht zugewiesen werden.A variable of one type cannot be assigned the other type. Das C#-Typsystem verwendet die Namen der definierten Typen, nicht die Struktur.The C# type system uses the names of the defined types, not the structure.

Alle diese Definitionen von Delegattypen in der .NET Core-Bibliothek sollten bedeuten, dass Sie keinen neuen Delegattypen für jede neue Funktion, die Sie erstellen und die Delegaten erfordert, definieren müssen.All these delegate type definitions in the .NET Core Library should mean that you do not need to define a new delegate type for any new feature you create that requires delegates. Diese generischen Definitionen sollten alle Delegattypen bereitstellen, die Sie in den meisten Fällen benötigen.These generic definitions should provide all the delegate types you need under most situations. Sie können einen dieser Typen mit den erforderlichen Parametern einfach instanziieren.You can simply instantiate one of these types with the required type parameters. Im Falle von Algorithmen, die generisch vorgenommen werden können, können diese Delegaten als generische Typen verwendet werden.In the case of algorithms that can be made generic, these delegates can be used as generic types.

Dies sollte Zeit sparen und die Anzahl neuer Typen minimieren, die Sie erstellen müssen, um mit Delegaten zu arbeiten.This should save time, and minimize the number of new types that you need to create in order to work with delegates.

Im nächsten Artikel sehen Sie einige allgemeine Muster für die praktische Arbeit mit Delegaten.In the next article, you'll see several common patterns for working with delegates in practice.

WeiterNext