Delegate Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Representerar ett ombud, som är en datastruktur som refererar till en statisk metod eller till en klassinstans och en instansmetod för den klassen.
public ref class Delegate abstract
public ref class Delegate abstract : ICloneable, System::Runtime::Serialization::ISerializable
public abstract class Delegate
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
type Delegate = class
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
type Delegate = class
interface ICloneable
interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Delegate = class
interface ICloneable
interface ISerializable
type Delegate = class
interface ICloneable
interface ISerializable
Public MustInherit Class Delegate
Public MustInherit Class Delegate
Implements ICloneable, ISerializable
- Arv
-
Delegate
- Härledda
- Attribut
- Implementeringar
Kommentarer
Klassen Delegate är basklassen för ombudstyper. Det är dock bara systemet och kompilatorerna som uttryckligen Delegate kan härledas från klassen eller från MulticastDelegate klassen. Det är inte heller tillåtet att härleda en ny typ från en ombudstyp. Klassen betraktas inte som en ombudstyp. Det Delegate är en klass som används för att härleda ombudstyper.
De flesta språk implementerar ett delegate nyckelord, och kompilatorer för dessa språk kan härledas från MulticastDelegate klassen. Därför bör användarna använda nyckelordet delegate som tillhandahålls av språket.
Note
Den vanliga språkkörningen tillhandahåller en Invoke metod för varje ombudstyp med samma signatur som ombudet. Du behöver inte anropa den här metoden explicit från C# eller Visual Basic eftersom kompilatorerna anropar den automatiskt. Metoden Invoke är användbar i reflektion när du vill hitta signaturen för ombudstypen.
Den vanliga språkkörningen ger varje ombudstyp och BeginInvokeEndInvoke metoder för att aktivera asynkron anrop av ombudet. Mer information om dessa metoder finns i Anropa synkrona metoder asynkront.
Deklarationen av en ombudstyp upprättar ett kontrakt som anger signaturen för en eller flera metoder. Ett ombud är en instans av en delegattyp som har referenser till:
- En instansmetod av en typ och ett målobjekt som kan tilldelas den typen.
- En instansmetod av en typ, med den dolda
thisparametern exponerad i den formella parameterlistan. Ombudet sägs vara ett ombud för öppen instans. - En statisk metod.
- En statisk metod och ett målobjekt som kan tilldelas den första parametern för metoden. Delegaten sägs vara stängd över sitt första argument.
Mer information om ombudsbindning finns i metodens CreateDelegate(Type, Object, MethodInfo, Boolean) överlagring.
När ett ombud representerar en instansmetod som stängts över sitt första argument (det vanligaste fallet) lagrar ombudet en referens till metodens startpunkt och en referens till ett objekt som kallas mål, vilket är av en typ som kan tilldelas till den typ som definierade metoden. När ett ombud representerar en öppen instansmetod lagrar den en referens till metodens startpunkt. Ombudets signatur måste innehålla den dolda this parametern i den formella parameterlistan. I det här fallet har ombudet ingen referens till ett målobjekt och ett målobjekt måste anges när ombudet anropas.
När ett ombud representerar en statisk metod lagrar ombudet en referens till metodens startpunkt. När ett ombud representerar en statisk metod som stängs över det första argumentet lagrar ombudet en referens till metodens startpunkt och en referens till ett målobjekt som kan tilldelas till typen av metodens första argument. När ombudet anropas tar det första argumentet för den statiska metoden emot målobjektet. Det första argumentet måste vara en referenstyp.
Anropslistan för ett ombud är en ordnad uppsättning ombud där varje element i listan anropar exakt en av de metoder som representeras av ombudet. En anropslista kan innehålla duplicerade metoder. Under ett anrop anropas metoder i den ordning de visas i listan över anrop. Ett ombud försöker anropa varje metod i listan över anrop. dubbletter anropas en gång för varje gång de visas i listan över anrop. Ombuden är oföränderliga. när den har skapats ändras inte anropslistan för ett ombud.
Ombud kallas multicast eller kombinerbara eftersom ett ombud kan anropa en eller flera metoder och kan användas för att kombinera åtgärder.
Att kombinera åtgärder, till exempel Combine och Remove, ändrar inte befintliga ombud. I stället returnerar en sådan åtgärd ett nytt ombud som innehåller resultatet av åtgärden, ett oförändrat ombud eller null. En kombinationsåtgärd returneras null när resultatet av åtgärden är ett ombud som inte refererar till minst en metod. En kombinationsåtgärd returnerar ett oförändrat ombud när den begärda åtgärden inte har någon effekt.
Note
Hanterade språk använder Combine metoderna och Remove för att implementera delegerande åtgärder. Exempel är operatorerna AddHandler och RemoveHandler i Visual Basic och operatorerna += och -= för ombudstyper i C#.
Generiska ombudstyper kan ha parametrar av varianttyp. Parametrar av typen Contravariant kan användas som parametertyper för ombudet och en parameter av typen covariant kan användas som returtyp. Med den här funktionen kan allmänna ombudstyper som konstrueras från samma generiska typdefinition vara tilldelningskompatibla om deras typargument är referenstyper med en arvsrelation, enligt beskrivningen i Covariance och Contravariance.
Note
Allmänna ombud som är tilldelningskompatibla på grund av varians är inte nödvändigtvis kompatibla. För att vara kombinerbara måste typerna matcha exakt. Anta till exempel att en klass med namnet Derived härleds från en klass med namnet Base. Ett ombud av typen Action<Base> (Action(Of Base) i Visual Basic) kan tilldelas till en variabel av typen Action<Derived>, men de två ombuden kan inte kombineras eftersom typerna inte matchar exakt.
Om en anropad metod genererar ett undantag slutar metoden att köras, undantaget skickas tillbaka till ombudets anropare och återstående metoder i listan över anrop anropas inte. Att fånga undantaget i anroparen ändrar inte det här beteendet.
När signaturen för de metoder som anropas av ett ombud innehåller ett returvärde returnerar ombudet returvärdet för det sista elementet i anropslistan. När signaturen innehåller en parameter som skickas med referens är det slutliga värdet för parametern resultatet av varje metod i anropslistan som körs sekventiellt och uppdaterar parameterns värde.
Den närmaste motsvarigheten till ett ombud i C är en funktionspekare. Ett ombud kan representera en statisk metod eller en instansmetod. När ombudet representerar en instansmetod lagrar ombudet inte bara en referens till metodens startpunkt, utan även en referens till klassinstansen. Till skillnad från funktionspekare är ombud objektorienterade och skriver säkert.
Exempel finns i Kompletterande API-kommentarer för System.Delegate.CreateDelegate.
Konstruktorer
| Name | Description |
|---|---|
| Delegate(Object, String) |
Initierar ett ombud som anropar den angivna instansmetoden på den angivna klassinstansen. |
| Delegate(Type, String) |
Initierar ett ombud som anropar den angivna statiska metoden från den angivna klassen. |
Egenskaper
| Name | Description |
|---|---|
| Method |
Hämtar metoden som representeras av ombudet. |
| Target |
Hämtar den klassinstans där det aktuella ombudet anropar instansmetoden. |
Metoder
| Name | Description |
|---|---|
| Clone() |
Skapar en ytlig kopia av ombudet. |
| Combine(Delegate, Delegate) |
Sammanfogar anropslistorna med två ombud. |
| Combine(Delegate[]) |
Sammanfogar anropslistorna för en matris med ombud. |
| CombineImpl(Delegate) |
Sammanfogar anropslistorna för det angivna ombudet för multicast (combinable) och det aktuella ombudet för multicast (combinable). |
| CreateDelegate(Type, MethodInfo, Boolean) |
Skapar ett ombud av den angivna typen för att representera den angivna statiska metoden, med det angivna beteendet vid bindningsfel. |
| CreateDelegate(Type, MethodInfo) |
Skapar ett ombud av den angivna typen för att representera den angivna metoden. |
| CreateDelegate(Type, Object, MethodInfo, Boolean) |
Skapar ett ombud av den angivna typen som representerar den angivna statiska metoden eller instansmetoden, med det angivna första argumentet och det angivna beteendet vid bindningsfel. |
| CreateDelegate(Type, Object, MethodInfo) |
Skapar ett ombud av den angivna typen som representerar den angivna statiska metoden eller instansmetoden med det angivna första argumentet. |
| CreateDelegate(Type, Object, String, Boolean, Boolean) |
Skapar ett ombud av den angivna typen som representerar den angivna instansmetoden som ska anropas på den angivna klassinstansen, med den angivna skiftlägeskänsligheten och det angivna beteendet vid bindningsfel. |
| CreateDelegate(Type, Object, String, Boolean) |
Skapar ett ombud av den angivna typen som representerar den angivna instansmetoden som ska anropas på den angivna klassinstansen med den angivna skiftlägeskänsligheten. |
| CreateDelegate(Type, Object, String) |
Skapar ett ombud av den angivna typen som representerar den angivna instansmetoden som ska anropas på den angivna klassinstansen. |
| CreateDelegate(Type, Type, String, Boolean, Boolean) |
Skapar ett ombud av den angivna typen som representerar den angivna statiska metoden för den angivna klassen, med den angivna skiftlägeskänsligheten och det angivna beteendet vid bindningsfel. |
| CreateDelegate(Type, Type, String, Boolean) |
Skapar ett ombud av den angivna typen som representerar den angivna statiska metoden för den angivna klassen med den angivna skiftlägeskänsligheten. |
| CreateDelegate(Type, Type, String) |
Skapar ett ombud av den angivna typen som representerar den angivna statiska metoden för den angivna klassen. |
| DynamicInvoke(Object[]) |
Anropar dynamiskt (sent bunden) metoden som representeras av det aktuella ombudet. |
| DynamicInvokeImpl(Object[]) |
Anropar dynamiskt (sent bunden) metoden som representeras av det aktuella ombudet. |
| Equals(Object) |
Avgör om det angivna objektet och det aktuella ombudet är av samma typ och delar samma mål, metoder och anropslista. |
| GetHashCode() |
Returnerar en hash-kod för ombudet. |
| GetInvocationList() |
Returnerar anropslistan för ombudet. |
| GetMethodImpl() |
Hämtar den metod som representeras av det aktuella ombudet. |
| GetObjectData(SerializationInfo, StreamingContext) |
Stöds ej. |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| Remove(Delegate, Delegate) |
Tar bort den sista förekomsten av anropslistan för ett ombud från anropslistan för ett annat ombud. |
| RemoveAll(Delegate, Delegate) |
Tar bort alla förekomster av anropslistan för ett ombud från anropslistan för ett annat ombud. |
| RemoveImpl(Delegate) |
Tar bort anropslistan för ett ombud från anropslistan för ett annat ombud. |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |
Operatorer
| Name | Description |
|---|---|
| Equality(Delegate, Delegate) |
Avgör om de angivna ombuden är lika. |
| Inequality(Delegate, Delegate) |
Avgör om de angivna ombuden inte är lika med. |
Tilläggsmetoder
| Name | Description |
|---|---|
| GetMethodInfo(Delegate) |
Hämtar ett objekt som representerar den metod som representeras av det angivna ombudet. |