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 是委派類型的基類。 不過,只有系統和編譯程式可以從 類別或 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
的參數;在此情況下,委派沒有目標對象的參考,而且在叫用委派時必須提供目標物件。
當委派代表靜態方法時,委派會儲存方法進入點的參考。 當委派代表關閉其第一個自變數的靜態方法時,委派會儲存方法進入點的參考,以及可指派給方法第一個自變數類型的目標對象的參考。 叫用委派時,靜態方法的第一個自變數會收到目標物件。 這個第一個自變數必須是參考型別。
委派的調用清單是一組已排序的委派,其中清單的每個元素都會叫用委派所代表的方法之一。 調用清單可以包含重複的方法。 在叫用期間,會依叫用方法出現在調用清單中的順序叫用。 委派會嘗試在其調用清單中叫用每個方法;每次在調用清單中出現重複專案時,都會叫用重複專案一次。 委派是不可變的;建立之後,委派的調用清單不會變更。
委派稱為多播或可結合,因為委派可以叫用一或多個方法,而且可用於合併作業。
合併作業,例如 Combine 和 Remove,並不會改變現有的委派。 相反地,這類作業會傳回新的委派,其中包含作業的結果、未變更的委派或 null
。 當作業的結果是未參考至少一個方法的委派時,合併作業會 null
傳回。 當要求的作業沒有作用時,合併作業會傳回未變更的委派。
注意
Managed 語言會使用 Combine 和 Remove 方法來實作委派作業。 範例包括 AddHandler
Visual Basic 中的 和 RemoveHandler
語句,以及 C# 中委派類型的 += 和 -= 運算符。
從 .NET Framework 4 開始,泛型委派類型可以有變體類型參數。 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[]) |
串連委派陣列的引動過程清單。 |
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) |
取得表示特定委派所代表之方法的物件。 |
適用於
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應