共用方式為


delegate (C++ 元件擴充功能)

宣告表示函式指標的型別。

所有執行階段

Windows 執行階段 和 Common Language Runtime 兩者都支援委派。

3z2x4f55.collapse_all(zh-tw,VS.110).gif備註

delegate 是內容相關性關鍵字。 如需詳細資訊,請參閱視內容而有所區別的關鍵字 (C++ 元件擴充功能)

若要在編譯時期偵測型別是否為委派,請使用 __is_delegate() 型別特性。 如需詳細資訊,請參閱型別特性的編譯器支援 (C++ 元件擴充功能)

Windows 執行階段

C++/CX 支援下列語法的支援委派。

3z2x4f55.collapse_all(zh-tw,VS.110).gif語法

access delegate return-type delegate-type-identifier ([ parameters ])

3z2x4f55.collapse_all(zh-tw,VS.110).gif參數

  • 存取
    (選擇性) 委派的存取範圍,可以是 public (預設值) 或 private。 函式原型也可以使用 const 或 volatile 關鍵字來限定。

  • 傳回型別
    函式原型的傳回型別。

  • 委派型別識別項
    宣告的委派型別名稱。

  • 參數
    (選擇性) 函式原型的型別和識別項。

3z2x4f55.collapse_all(zh-tw,VS.110).gif備註

使用委派型別識別項來宣告具有和委派相同原型的事件。 如需詳細資訊,請參閱委派 (C++/CX)

3z2x4f55.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/ZW

Common Language Runtime

Common Language Runtime 支援具有下列語法的委派。

3z2x4f55.collapse_all(zh-tw,VS.110).gif語法

access delegate function_declaration

3z2x4f55.collapse_all(zh-tw,VS.110).gif參數

  • 存取
    (選擇性) 組件外之委派的存取範圍可以是公用或私用。 預設為私用。 在類別中,委派可以有任何存取範圍。

  • function_declaration
    可繫結至委派之函式的簽章。 委派的傳回型別可以是任何 Managed 型別。 基於互通性的原因,建議委派的傳回型別使用 CLS 型別。

    若要定義未繫結的委派,function_declaration 中的第一個參數應該是物件 this 指標的型別。 如需詳細資訊,請參閱未繫結的委派

3z2x4f55.collapse_all(zh-tw,VS.110).gif備註

委派為多點傳送:「函式指標」可以繫結至 Managed 類別中的一個或多個方法。 delegate 關鍵字會定義具有特定方法簽章的多點傳送委派型別。

委派也可以繫結至實值類別的方法,例如靜態方法。

委派具有下列特性:

  • 其繼承自 System::MulticastDelegate

  • 其中的建構函式會接受兩個引數:Managed 類別或 NULL (適用於繫結至靜態方法的情況) 的指標,以及指定之型別的完整方法。

  • 這會有名稱為 Invoke 的方法,其簽章與委派的簽章相符。

叫用委派時,是依照原先附加其函式的順序呼叫函式。

委派的傳回值是其最後一個附加成員函式的傳回值。

委派無法被多載。

委派可以是繫結或未繫結的。

當您將繫結的委派執行個體化時,第一個引數會是物件參考。 委派具現化的第二個引數必須是 Managed 類別物件之方法的位址或實值型別之方法的指標。 委派具現化的第二個引數必須以完整類別範圍語法為方法命名,並套用傳址運算子。

當您將繫結的委派執行個體化時,第一個引數會是 Managed 類別物件之方法的位址,或是實值型別之方法的指標。 引數必須以完整類別範圍語法為方法命名,並套用傳址運算子。

建立靜態或全域函式的委派時,只需要一個參數:函式 (或者,函式的位址)。

如需委派的詳細資訊,請參閱

3z2x4f55.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/clr

3z2x4f55.collapse_all(zh-tw,VS.110).gif範例

範例

下列範例說明如何宣告、初始化和叫用委派。

// mcppv2_delegate.cpp
// compile with: /clr
using namespace System;

// declare a delegate
public delegate void MyDel(int i);

ref class A {
public:
   void func1(int i) {
      Console::WriteLine("in func1 {0}", i);
   }

   void func2(int i) {
      Console::WriteLine("in func2 {0}", i);
   }

   static void func3(int i) {
      Console::WriteLine("in static func3 {0}", i);
   }
};

int main () {
   A ^ a = gcnew A;

   // declare a delegate instance
   MyDel^ DelInst;

   // test if delegate is initialized
   if (DelInst)
      DelInst(7);
   
   // assigning to delegate
   DelInst = gcnew MyDel(a, &A::func1);

   // invoke delegate
   if (DelInst)
      DelInst(8);

   // add a function
   DelInst += gcnew MyDel(a, &A::func2);

   DelInst(9);

   // remove a function
   DelInst -= gcnew MyDel(a, &A::func1);

   // invoke delegate with Invoke
   DelInst->Invoke(10);

   // make delegate to static function
   MyDel ^ StaticDelInst = gcnew MyDel(&A::func3);
   StaticDelInst(11);
}

Output

  
  
  
  
  

請參閱

概念

執行階段平台的元件擴充功能