2014-09-30 20 views
0

在下面的代碼中,我創建了一個名爲Mhd的代表 - 就像Action代表一樣。
我的問題:如果兩位代表都是public,爲什麼只有Action代表可以從另一個類中看到而不是Mhd行動和委託之間的輔助功能

static void Main(string[] args) 
    { 
     new Test().Yaser(); //this can be done 
     new Test().mhd(); //this can not be done 
    } 
    class Test 
    { 
     public Action Yaser; 
     public delegate void Mhd(); 
    } 

    //and Action definition is public delegate void Action(); 

任何幫助理解:)

回答

2

的變量對於我的回答是有道理的,但要記住的定義是非常重要的代表。根據MSDN

委託是一種引用類型,可用於封裝指定方法或匿名方法。

代表是參考?!?!

如果你熟悉C++,你知道的另一種說法參考指針。 (事實上​​,C++開發人員通過函數指針獲取類似的功能給C#委託。)

委託人被引用的意義是什麼?在通用類型系統提供的基本構造中,.NET Framework有另一個引用類型:class。說代表是參考類型就像說代表是類。讓我們回顧一下我們如何使用類。

有3個步驟,你需要遵循之前,你可以使用一個類的實例:

  • 類型聲明:class Test { public Action Yaser; }
  • 實例聲明:class Test testClassObject;
  • 實例化:testClassObject = new Test();

(通常,我們結合了實例聲明和實例化)。

我們說代表是類。因此,代表使用遵循相同的模式:

  • 類型聲明:public delegate void Mhd();
  • 實例聲明:public Mhd myMhd;
  • 實例化:myDelegateField = new Mhd(SomeMethod);

別急,什麼是SomeMethod?真的,沒關係。我們所知道的是,它的簽名必須與Mhd的簽名相匹配。換句話說,void SomeMethod()

讓我們檢查並修復您的類聲明。一種可能的實現如下所示:

class Test 
{ 
    public Action Yaser;  // instance declaration 
    public delegate void Mhd(); // type declaration 
    public Mhd myMhd;   // instance declaration 

    public Test() 
    { 
     // instantiation 
     this.myMhd = new Mhd(this.SomeMethod); 
    } 

    private void SomeMethod() 
    { 
     // your implementation 
    } 
} 
+0

非常感謝但 實例化必須myMhd =新MHD(的someMethod);對? – Mhd 2014-10-03 07:35:11

+0

是的,它顯示在代表項目符號中,但我編輯了該類來完成示例:) – 2014-10-06 21:58:08

1
public Action Yaser; 

聲明Action類型的字段,而

public delegate void Mhd(); 

聲明Mhd作爲委託類型。

0

因爲Mhd不是您的班級的成員。這是您在班級中聲明的代表類型。

所以你不能把它像一個成員方法或屬性,但你可以用它來聲明該類型

Test.Mhd myDelegate;