Delegate 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
表示委派,這是參考靜態方法或類別實例和該類別之實例方法的數據結構。
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 會為每個委派類型提供 BeginInvoke
和 EndInvoke
方法,以啟用委派的異步調用。 如需這些方法的詳細資訊,請參閱 異步呼叫同步方法。
委派類型的宣告會建立合約,指定一或多個方法的簽章。 委派是具有下列參考之委派類型的實例:
型別的實例方法,以及可指派給該型別的目標物件。
型別的實例方法,在正式參數清單中公開隱藏
this
參數。 委派據說是開放式實例委派。靜態方法。
靜態方法和目標物件,可指派給 方法的第一個參數。 據說代表在第一次爭論中被關閉。
如需委派系結的詳細資訊,請參閱 CreateDelegate(Type, Object, MethodInfo, Boolean) 方法多載。
當委派代表在其第一個自變數上關閉的實例方法時(最常見的情況),委派會儲存方法進入點的參考,以及呼叫目標的對象參考,而該對象的類型可指派給定義方法的型別。 當委派代表開啟的實例方法時,它會儲存方法進入點的參考。 委派簽章必須在其正式參數清單中包含隱藏 this
參數;在此情況下,委派沒有目標對象的參考,而且叫用委派時必須提供目標物件。
當委派代表靜態方法時,委派會儲存方法進入點的參考。 當委派代表在其第一個自變數上關閉的靜態方法時,委派會儲存方法進入點的參考,以及可指派給方法第一個自變數類型的目標對象的參考。 叫用委派時,靜態方法的第一個自變數會接收目標物件。 第一個自變數必須是參考型別。
委派的調用清單是一組已排序的委派,其中清單的每個元素都會叫用委派所代表的其中一個方法。 調用清單可以包含重複的方法。 在叫用期間,會依叫用方法出現在調用清單中的順序叫用。 委派會嘗試在其調用清單中叫用每個方法;每次出現在調用清單中時,都會叫用重複專案一次。 委派是不可變的;建立之後,委派的調用清單不會變更。
委派稱為多播或可結合,因為委派可以叫用一或多個方法,而且可用於合併作業。
合併作業,例如 Combine 和 Remove,不會改變現有的委派。 相反地,這類作業會傳回新的委派,其中包含作業的結果、未變更的委派,或 null
。 當作業的結果是未參考至少一個方法的委派時,合併作業會傳回 null
。 當要求的作業沒有作用時,合併作業會傳回未變更的委派。
注意
Managed 語言會使用 Combine 和 Remove 方法來實作委派作業。 範例包括 Visual Basic 中的 AddHandler
和 RemoveHandler
語句,以及 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 |
取得值,這個值表示 Delegate 是否有單一調用目標。 |
Method |
取得委派所表示的方法。 |
Target |
取得目前委派叫用實例方法的類別實例。 |
方法
運算子
Equality(Delegate, Delegate) |
判斷指定的委派是否相等。 |
Inequality(Delegate, Delegate) |
判斷指定的委派是否不相等。 |
擴充方法
GetMethodInfo(Delegate) |
取得 物件,表示指定委派所表示的方法。 |