程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> c#匿名方法的靜態數據成員和實例數據成員用法

c#匿名方法的靜態數據成員和實例數據成員用法

編輯:關於C#

匿名方法總是以一個delegate關鍵字開始,後面跟著用在方法和方法體(the method body)本身中的參數。正如從上面示例中所見,用戶不需要確定匿名方法的返回類型。它(譯注:指返回類型)由方法體中的return語句推斷而來。.NET CLR不能執行像匿名方法一樣的自由流(free flowing)代碼塊。CLR要求:它執行的每個方法是一個類型的一部分,並且應該是一個靜態(static)方法或實例(instance)方法(譯注:若一個方法聲明中含有 static 修飾符,則稱該方法為靜態方法。若其中沒有 static 修飾符時,則稱該方法為實例方法。靜態方法不對特定實例進行操作,在靜態方法中引用 this 是編譯時錯誤。實例方法對類的某個給定的實例進行操作,而且可以用 this來訪問該實例)。因此當你在一個類的代碼中寫匿名方法並編譯這個代碼時,C#編譯器默默地在你定義匿名方法的相同的類中創建了一個靜態或實例方法。所以匿名方法只是一個在類中定義你自己方法以傳遞到委托(委托處理器/事件處理器)的方便的語法。

當你編譯上面的示例時,C#編譯器在類''Program''內部即我們定義匿名方法的地方創建了兩個private static方法。它此時用這些static方法的地址取代了匿名方法。編譯器決定如何創建靜態方法或實例方法取決於匿名方法被定義的類中的靜態或實例數據成員的用法。在我們的示例中,我們沒有用到任何類''Program''的數據成員,因為調用一個靜態方法而不是一個實例方法將是高效的,因此C#編譯器創建一個static方法來封裝我們的匿名方法的代碼。下面是這個示例程序集''Program'' 類的ILDASM視圖。高亮部分顯示了由C#編譯器默默添加到''Program''類的新的靜態方法。

如果我們已經使用了用匿名方法的''Program'' 類的任何靜態數據,C#編譯器將仍然在''Program'' 類裡創建一個靜態方法來包裝匿名方法。

匿名方法的實例數據成員用法

讓我們在我們的示例中的''Program''類中定義一個新的實例方法,並使用示例類(譯注:即''Program''類)一個實例數據成員。下面的代碼顯示了修改後的示例:

public class Program
{
  public delegate void MyDelegate();
  public static void Main(string[] args)
  {
   //實例數據成員測試
   Program p = new Program();
   for(int i=1;i<=5;i++)
    p.TestInstanceDataMembers();
  }
  public void TestInstanceDataMembers()
  {
   MyDelegate d = delegate
   {
    Console.WriteLine("Count: {0}",++m_iCount);
   };
   d();
  }
  public int m_iCount = 0;
}

我們定義了一個新的實例方法:TestInstanceDataMembers,在''Program''類中這個方法定義了一個匿名方法,匿名方法使用了實例數據成員:隸屬''Program''類的m_iCount。當這個示例編譯時,C#編譯器將創建一個private實例方法來包裝這個在TestInstanceDataMembers中定義的匿名方法。C#編譯器必須創建一個實例方法因為該方法需要訪問''Program''類的實例數據成員。下面是這個示例程序集''Program''類的ILDASM視圖。在圖的下部選中部分顯示了由C#編譯器默默添加到''Program''類的新的private實例方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved