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

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

注意

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

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

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

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

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

  • 靜態方法。

  • 靜態方法和目標物件,可指派給 方法的第一個參數。 委派稱為透過其第一個自變數關閉。

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

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

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

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

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

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

注意

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

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

注意

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

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

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

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

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

建構函式

Delegate(Object, String)

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

Delegate(Type, String)

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

屬性

HasSingleTarget

表示委派,這個資料結構指的是靜態方法,或類別執行個體與該類別的執行個體方法。

Method

取得委派所表示的方法。

Target

取得目前的委派在其中叫用執行個體方法的類別執行個體。

方法

Clone()

建立委派的淺層複本 (Shallow Copy)。

Combine(Delegate, Delegate)

串連兩個委派的引動過程清單。

Combine(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)

取得表示特定委派所代表之方法的物件。

適用於

另請參閱