2012-01-04 60 views
8

我的同事和我在研究獲取委託的調用列表時發現了這個問題。如果你在類X中創建一個事件,那麼你可以在該類中訪問該事件的公共方法。但是(並且請忽略諸如爲什麼你有公共訪問類成員的東西,這不是我們要求的東西!),如果我們有一個類Y實例化X,並訪問X中的事件,它不能調用任何公共方法,例如事件的GetInvocationList()。我們想知道這是如何工作的。下面是一個代碼示例(閱讀評論,看看我們的意思):如何使公共方法僅在類本身和擁有C#中的對象的類中可見?

public class X 
    { 
     public delegate void TestMethod(); 

     public event TestMethod testMethod; 

     private void rubbish() 
     { 
      // can access testMethod.GetInvocationList() fine here 
      testMethod.GetInvocationList(); 
     } 
    } 

    public class Y 
    { 
     public Y() 
     { 
      X x = new X(); 
      x.testMethod += this.test; 

      // here it says testMethod can only appear on the left hand side of += or -= 
      // why is this? (i.e. the below line is invalid) 
      x.testMethod.GetInvocationList(); 
     } 

     public void test() 
     { 
     } 
    } 

出於好奇,你是怎麼做到這一點,並找到適合具有這種特徵avaialble的原因是什麼?

非常感謝 阿米特

+0

你問「我怎麼能爲我自己的班級完成同樣的事情」,或者「爲什麼這樣設計事件」? – ken2k 2012-01-04 12:41:42

+0

@ ken2k:我想都是。 – Maheep 2012-01-04 12:42:31

+0

刪除**事件**關鍵字。 – adatapost 2012-01-04 12:42:52

回答

9

這就是event關鍵字做什麼;它是一種限制操作,而不是訂閱擁有的類。如果您刪除event關鍵字,您最終將得到一個普通的委託,讓班外的客戶可以撥打例如GetInvocationList()方法。

blog post中,他們比較生成的IL代碼和普通委託與事件的處理方式完全相同。 event關鍵字是一個編譯時修飾符,它限制對委託方法的訪問。 (它也可以在接口中使用)。所有的細節都在博客文章中。

+0

+1有趣的博客文章。 – 2012-01-04 12:48:02

+0

謝謝安德斯!我會閱讀博客並回過頭來回答任何其他問題(例如,這是我們可以爲我們自己的方法做些什麼,或者在事件關鍵字出現時會發生一些奇怪的事情) – user555265 2012-01-04 12:54:09

+1

@ user555265它將被編入編譯器,但是可能會有一些後期處理的樂趣,您可以在運行時讓事情發生。這裏的代碼允許人們對枚舉和委託進行約束,而不是相同的任務,但也許是相同的解決方案,因此可能值得回顧一下:http://code.google.com/p/unconstrained-melody/ – 2012-01-04 13:07:48

0

AFAIK只使用事件時,如果在該行中刪除「事件」,你可以使用的方法就好的

1

我在這裏發現了一些信息 - 聲明類以外的訪問非常受限 - 下面是從MSDN站點(Events tutorial)。

只能在聲明事件的類內調用事件。聯繫到宣佈它的類 以外的活動,活動看起來像一個字段,但訪問該 字段是非常受限制的。唯一可以做的事情是:

撰寫一個新的委託到該字段。

從(可能是複合)字段中刪除委託。

這是通過+ =和 - =運算符完成的。要開始接收事件 調用,客戶端代碼首先創建一個事件類型爲 的委派,該委派引用應從該事件調用的方法。然後 它將該代表組合到可以使用+ =連接到事件 的任何其他代表。

更多信息,請訪問鏈接。

0

想想代表分別從事件

嗯...我要在這裏乘坐WAG。

將您的委託聲明放在您的名稱空間中,任何類之外。

  • 在類X,創建委託的一個實例(沒關係的情況下)和寄存器 「處理程序:」(我使用該術語鬆耦合)如期望。

  • 創建一個公共方法或屬性,使得Y類可以獲得(參考 )委託,因此它是調用列表。

  • 現在,您可以在Y類中執行任何您想要的操作。甚至可以使用X類的委託調用列表在Y類中創建 「鏡像」事件。

相關問題