共用方式為


Delegate 類別

定義

表示委派,這是參考靜態方法或類別實例和該類別之實例方法的數據結構。

public ref class Delegate abstract
public ref class Delegate abstract : ICloneable, System::Runtime::Serialization::ISerializable
public abstract class Delegate
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[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
type Delegate = class
type Delegate = class
    interface ICloneable
    interface ISerializable
[<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
Public MustInherit Class Delegate
Public MustInherit Class Delegate
Implements ICloneable, ISerializable
繼承
Delegate
衍生
屬性
實作

備註

Delegate 類別是委派類型的基類。 不過,只有系統和編譯程式可以明確衍生自 Delegate 類別或 MulticastDelegate 類別。 也不允許從委派類型衍生新的類型。 Delegate 類別不會被視為委派類型;它是用來衍生委派類型的類別。

大部分的語言都會實作 delegate 關鍵詞,而且這些語言的編譯程式能夠衍生自 MulticastDelegate 類別;因此,用戶應該使用語言所提供的 delegate 關鍵詞。

注意

Common Language Runtime 會為每個委派類型提供 Invoke 方法,其簽章與委派相同。 您不需要從 C#、Visual Basic 或 Visual C++明確呼叫此方法,因為編譯程式會自動呼叫此方法。 當您想要尋找委派類型的簽章時,Invoke 方法在 反映 很有用。

Common Language Runtime 會為每個委派類型提供 BeginInvokeEndInvoke 方法,以啟用委派的異步調用。 如需這些方法的詳細資訊,請參閱 異步呼叫同步方法

委派類型的宣告會建立合約,指定一或多個方法的簽章。 委派是具有下列參考之委派類型的實例:

  • 型別的實例方法,以及可指派給該型別的目標物件。

  • 型別的實例方法,在正式參數清單中公開隱藏 this 參數。 委派據說是開放式實例委派。

  • 靜態方法。

  • 靜態方法和目標物件,可指派給 方法的第一個參數。 據說代表在第一次爭論中被關閉。

如需委派系結的詳細資訊,請參閱 CreateDelegate(Type, Object, MethodInfo, Boolean) 方法多載。

當委派代表在其第一個自變數上關閉的實例方法時(最常見的情況),委派會儲存方法進入點的參考,以及呼叫目標的對象參考,而該對象的類型可指派給定義方法的型別。 當委派代表開啟的實例方法時,它會儲存方法進入點的參考。 委派簽章必須在其正式參數清單中包含隱藏 this 參數;在此情況下,委派沒有目標對象的參考,而且叫用委派時必須提供目標物件。

當委派代表靜態方法時,委派會儲存方法進入點的參考。 當委派代表在其第一個自變數上關閉的靜態方法時,委派會儲存方法進入點的參考,以及可指派給方法第一個自變數類型的目標對象的參考。 叫用委派時,靜態方法的第一個自變數會接收目標物件。 第一個自變數必須是參考型別。

委派的調用清單是一組已排序的委派,其中清單的每個元素都會叫用委派所代表的其中一個方法。 調用清單可以包含重複的方法。 在叫用期間,會依叫用方法出現在調用清單中的順序叫用。 委派會嘗試在其調用清單中叫用每個方法;每次出現在調用清單中時,都會叫用重複專案一次。 委派是不可變的;建立之後,委派的調用清單不會變更。

委派稱為多播或可結合,因為委派可以叫用一或多個方法,而且可用於合併作業。

合併作業,例如 CombineRemove,不會改變現有的委派。 相反地,這類作業會傳回新的委派,其中包含作業的結果、未變更的委派,或 null。 當作業的結果是未參考至少一個方法的委派時,合併作業會傳回 null。 當要求的作業沒有作用時,合併作業會傳回未變更的委派。

注意

Managed 語言會使用 CombineRemove 方法來實作委派作業。 範例包括 Visual Basic 中的 AddHandlerRemoveHandler 語句,以及 C# 中委派類型的 += 和 -= 運算符。

從 .NET Framework 4 開始,泛型委派類型可以有 Variant 類型參數。 Contravariant 類型參數可以當做委派的參數類型使用,而covariant類型參數可以當做傳回型別使用。 這項功能可讓從相同泛型型別定義建構的泛型委派型別,如果其型別自變數是具有繼承關聯性的參考型別,就能夠與指派相容,如 共變數和 Contravariance中所述。

注意

因為變異數而與指派相容的泛型委派不一定可以結合。 若要可組合,類型必須完全相符。 例如,假設名為 Derived 的類別衍生自名為 Base的類別。 類型為 Action<Base> 的委派(在 Visual Basic 中Action(Of Base))可以指派給類型為 Action<Derived>的變數,但無法合併這兩個委派,因為類型不完全相符。

如果叫用的方法擲回例外狀況,則方法會停止執行,例外狀況會傳回委派的呼叫端,而且不會叫用調用清單中的其餘方法。 攔截呼叫端中的例外狀況並不會改變此行為。

當委派叫用的方法簽章包含傳回值時,委派會傳回調用清單中最後一個專案的傳回值。 當簽章包含以傳址方式傳遞的參數時,參數的最終值就是叫用清單中每個方法以循序方式執行並更新參數值的結果。

C 中委派最接近的對等專案是函式指標。 委派可以代表靜態方法或實例方法。 當委派代表實例方法時,委派不僅會儲存方法進入點的參考,也會儲存類別實例的參考。 與函式指標不同,委派是面向物件且類型安全。

如需範例,請參閱 System.Delegate.CreateDelegate的補充 API 備註。

建構函式

Delegate(Object, String)

初始化委派,這個委派會在指定的類別實例上叫用指定的實例方法。

Delegate(Type, String)

初始化委派,這個委派會從指定的類別叫用指定的靜態方法。

屬性

HasSingleTarget

表示委派,這是參考靜態方法或類別實例和該類別之實例方法的數據結構。

Method

取得委派所表示的方法。

Target

取得目前委派叫用實例方法的類別實例。

方法

Clone()

建立委派的淺層複本。

Combine(Delegate, Delegate)

串連兩個委派的調用清單。

Combine(Delegate[])

串連委派陣列的調用清單。

Combine(ReadOnlySpan<Delegate>)

表示委派,這是參考靜態方法或類別實例和該類別之實例方法的數據結構。

CombineImpl(Delegate)

串連指定多播(可結合)委派的調用清單,以及目前的多播(可組合)委派。

CreateDelegate(Type, MethodInfo)

建立指定型別的委派,以表示指定的方法。

CreateDelegate(Type, MethodInfo, Boolean)

建立指定型別的委派,以表示指定的靜態方法,並在無法系結時指定的行為。

CreateDelegate(Type, Object, MethodInfo)

使用指定的第一個自變數,建立代表指定之靜態或實例方法之指定型別的委派。

CreateDelegate(Type, Object, MethodInfo, Boolean)

建立代表指定之靜態或實例方法之指定型別的委派,其中具有指定的第一個自變數,以及無法系結的指定行為。

CreateDelegate(Type, Object, String)

建立指定型別的委派,此委派表示在指定的類別實例上叫用的指定實例方法。

CreateDelegate(Type, Object, String, Boolean)

建立指定型別的委派,這個委派表示指定實例方法,以在具有指定大小寫的指定類別實例上叫用。

CreateDelegate(Type, Object, String, Boolean, Boolean)

建立指定型別的委派,這個委派表示指定類別實例上要叫用的指定實例方法,並具有指定的區分大小寫,以及無法系結的指定行為。

CreateDelegate(Type, Type, String)

建立指定型別的委派,此委派表示指定類別的指定靜態方法。

CreateDelegate(Type, Type, String, Boolean)

建立指定型別的委派,此委派代表指定類別的指定靜態方法,並具有指定的區分大小寫。

CreateDelegate(Type, Type, String, Boolean, Boolean)

建立指定型別的委派,此委派表示指定類別的指定靜態方法,具有指定的區分大小寫,以及無法系結的指定行為。

DynamicInvoke(Object[])

以動態方式叫用目前委派所表示的方法(晚期綁定)。

DynamicInvokeImpl(Object[])

以動態方式叫用目前委派所表示的方法(晚期綁定)。

EnumerateInvocationList<TDelegate>(TDelegate)

表示委派,這是參考靜態方法或類別實例和該類別之實例方法的數據結構。

Equals(Object)

判斷指定的物件和目前的委派是否屬於相同的類型,並共用相同的目標、方法和調用清單。

GetHashCode()

傳回委派的哈希碼。

GetInvocationList()

傳回委派的調用清單。

GetMethodImpl()

取得目前委派所表示的方法。

GetObjectData(SerializationInfo, StreamingContext)
已淘汰.

不支援。

GetType()

取得目前實例的 Type

(繼承來源 Object)
MemberwiseClone()

建立目前 Object的淺層複本。

(繼承來源 Object)
Remove(Delegate, Delegate)

從另一個委派的調用清單中,移除委派的最後一個叫用清單。

RemoveAll(Delegate, Delegate)

從另一個委派的調用清單中,移除委派的所有叫用清單。

RemoveImpl(Delegate)

從另一個委派的調用清單中移除委派的調用清單。

ToString()

傳回表示目前 物件的字串。

(繼承來源 Object)

運算子

Equality(Delegate, Delegate)

判斷指定的委派是否相等。

Inequality(Delegate, Delegate)

判斷指定的委派是否不相等。

擴充方法

GetMethodInfo(Delegate)

取得 物件,表示指定委派所表示的方法。

適用於

另請參閱