Delegate 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
代表一個代理,這是一種資料結構,指涉靜態方法或類別實例與該類別的實例方法。
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
- 繼承
-
Delegate
- 衍生
- 屬性
- 實作
備註
這個 Delegate 類別是代理型態的基礎類別。 然而,只有系統與編譯器能明確從 Delegate 該類別或該 MulticastDelegate 類別衍生。 也不允許從代理類型推導出新類型。 該 Delegate 類別不被視為代理型別;它是用來推導代理型別的類別。
大多數語言實作關鍵字 delegate ,而這些語言的編譯器也能從該 MulticastDelegate 類別推導出來;因此,使用者應該使用 delegate 該語言提供的關鍵字。
Note
通用語言執行時為每個代理類型提供 Invoke 一個方法,且與代理擁有相同的簽名。 你不必從 C# 或 Visual Basic 明確呼叫這個方法,因為編譯器會自動呼叫它。 當你想找到代理類型的簽名時,這個 Invoke 方法在 反思 時非常有用。
通用語言執行時為每個代理 BeginInvoke 類型提供 和 EndInvoke 方法,以實現代理的非同步呼叫。 欲了解更多這些方法,請參閱 「非同步呼叫同步方法」。
代理類型的宣告建立一個合約,指定一個或多個方法的簽名。 代理是一種代理類型的實例,具有以下參考:
- 一個類型的實例方法,以及可指派給該類型的目標物件。
- 一個類型的實例方法,隱藏
this參數會暴露在形式參數列表中。 代表稱為開放實例代表。 - 靜態方法。
- 一個靜態方法,以及一個可指派給方法第一個參數的目標物件。 代表在第一次辯論時被說成封閉。
欲了解更多代理綁定資訊,請參閱方法過載。CreateDelegate(Type, Object, MethodInfo, Boolean)
當代理代表一個對其第一個參數封閉的實例方法(最常見的情況)時,代理會儲存對該方法入口點的參考,以及一個稱為目標的物件的參考,該物件的型別可指派給定義該方法的型別。 當代理代表一個開放實例方法時,它會儲存對該方法入口點的參考。 代理簽名必須在其正式參數列表中包含隱藏 this 參數;此時代理沒有指向目標物件的參考,且在呼叫代理時必須提供目標物件。
當代理代表靜態方法時,代理會儲存該方法入口點的參考。 當代理代表一個靜態方法封閉於其第一個參數時,代理會儲存對方法入口點的參考,以及可指派為方法第一個參數類型所指派的目標物件的參考。 當代理被呼叫時,靜態方法的第一個參數會接收目標物件。 這個第一個參數必須是參考型態。
代理的呼叫清單是一組有序的代理,其中列表中的每個元素恰好呼叫該代理所代表的方法之一。 調用清單可以包含重複的方法。 在呼叫過程中,方法依照呼叫清單中出現的順序被呼叫。 代表嘗試調用其調用列表中的所有方法;重複者每次出現在召喚列表中都會被召喚一次。 代表是不變的;一旦建立,代表的召喚名單不會改變。
代理稱為多播或可組合,因為代理可以呼叫一種或多種方法,並可用於合併操作。
結合操作,如 Combine 和 Remove,不會改變現有的代理。 相反地,此類操作會回傳一個新的代理,包含該操作的結果、未改變的代理,或 null。 當合併操作的結果是一個代理,且不至少引用一個方法時,合併操作會回傳 null 。 當請求的操作沒有效果時,合併操作會回傳一個未改變的代理。
Note
受管理語言使用 and CombineRemove 方法來實作委派操作。 例如Visual Basic中的 AddHandler 和 RemoveHandler 語句,以及 C# 中代理型別的 += 和 -= 運算子。
通用代理類型可以有變體類型參數。 反變型參數可用作代理的參數型態,而協變型態參數則可作為回傳型別。 此功能允許由相同通用型別定義構造出的通用代理類型,若其型別參數是具有繼承關係的參考型別,則其賦值相容,如協 變與逆變性所述。
Note
因變異性而與賦值相容的通用代理不一定能組合。 要可組合,這些類型必須完全匹配。 例如,假設一個名為 Derived 的類別由一個名為 Base的類別推導而來。 類型為 Action<Base>(Visual Basic 中為 Action(Of Base))可以指派到類型為 Action<Derived> 的變數,但兩個代理無法合併,因為兩者的類型不完全匹配。
若呼叫方法拋出例外,該方法停止執行,例外會回傳給代理的呼叫者,呼叫清單中剩餘的方法則不再被呼叫。 在呼叫者中捕捉例外並不會改變此行為。
當代理所呼叫的方法簽名包含回傳值時,代理會回傳調用清單中最後一個元素的回傳值。 當簽名包含一個透過參考傳遞的參數時,該參數的最終值是呼叫清單中每個方法依序執行並更新參數值的結果。
C 中最接近代理的對應物是函數指標。 代理可以代表靜態方法或實例方法。 當代理代表實例方法時,代理不僅會儲存對該方法入口點的參考,也會儲存對類別實例的參考。 與函式指標不同,代理是物件導向且型別安全的。
範例請參見 System.Delegate.CreateDelegate 的補充 API 備註。
建構函式
| 名稱 | Description |
|---|---|
| Delegate(Object, String) |
初始化一個代理,該代理在指定的類別實例上呼叫指定的實例方法。 |
| Delegate(Type, String) |
初始化一個代理,從指定類別呼叫指定的靜態方法。 |
屬性
| 名稱 | Description |
|---|---|
| Method |
取得由代理所代表的方法。 |
| Target |
取得當前代理呼叫實例方法的類別實例。 |
方法
操作員
| 名稱 | Description |
|---|---|
| Equality(Delegate, Delegate) |
決定指定代表人數是否相等。 |
| Inequality(Delegate, Delegate) |
判斷指定代表是否不平等。 |
擴充方法
| 名稱 | Description |
|---|---|
| GetMethodInfo(Delegate) |
取得一個代表指定代理所代表方法的物件。 |