熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

如何充分利用C#匿名方法的平台優勢

2013-11-13 10:30:23  來源: .NET編程 

  在C# 聲明和使用委托要求你有委托和一個在委托被觸發時具有匹配簽名的能夠執行的方法以及一個將命名方法與委托關聯的分配語句作為C# 的新特性匿名方法基本上能夠提供與先前命名方法相同的功能但是它已經不再需要一個在關聯到委托之前就明確創建的方法了

  你可以把匿名方法想象為一個實現與委托進行關聯這項功能的便捷途徑如果同時看一下匿名方法實現和命名方法實現所取得IL結果你會發現這兩者之間的差別非常小當編譯器碰到匿名方法的時候它會在類裡面創建一個命名方法並將它與委托進行關聯所以匿名方法在運行期間與命名方法的性能非常類似——性能的增加體現在開發人員的生產效率上而不是運行期間的執行上

  如何使用匿名方法

  多用代碼少用說教來解釋和理解匿名方法會容易一些下面的例子應該能夠說明你自己可以如何利用匿名方法的優勢

  ——基礎知識

  使用匿名方法很簡單你只需要把匿名方法放在你通常放命名方法的關聯語句裡在下面這個例子裡我把匿名方法和示例的委托關聯在一起

  示例列表

  #region Simple example Example
    privatedelegatevoidExample();

    privatevoid btnExample_Click(object sender EventArgs e)
    {
        //Declare an instance of the Example delegate
        // You can see where Im using the anonymous
        // method in place of a named method it follows
        // the delegate() keyword
        Example example =
            newExample(
                delegate()
                {
                    MessageBoxShow(Example);
                });

        example();
    }
    #endregion

  ——變量范圍

  任何在匿名方法裡聲明的變量的范圍都不會超出匿名方法的代碼塊但是匿名方法確實具有訪問它們代碼塊之外的變量的能力只要這些變量在匿名方法所使用的范圍裡這些變量被微軟稱為外部變量下面示顯示了匿名方法如何引用外部變量

  示例列表

  #region Variable scope example Example
   privatedelegatevoidExample();

   privatevoid btnExample_Click(object sender EventArgs e)
   {
       //Setup our parameters
       string firstName = Zach;
       string lastName = Smith;

       //Create an instance of the Example delegate with an
       // anonymous method
       Example example =
           newExample(
               delegate() {
                   MessageBoxShow(firstName + + lastName);
              });

       //Execute the delegate
       example();
   }
   #endregion

  要注意的是根據MSDN的文檔匿名方法裡的refout參數無法被訪問到

  ——參數的傳遞

  你可以將參數傳遞給匿名方法方式就和你處理引用命名方法參數的委托一樣下面的示例說明這種類型的功能

  示例列表

  #region Parameter example Example
   privatedelegatevoidExample(string firstName string lastName);

   privatevoid btnExample_Click(object sender EventArgs e)
   {
       //Setup our parameters
       string parameter = Zach;
       string parameter = Smith;

       //Create an instance of the Example delegate with an
       // anonymous method
       Example example =
           newExample(
               delegate(string firstName string lastName)
               {
                   MessageBoxShow(Example: + firstName + + lastName);
               });

       //Execute the delegate
       example(parameter parameter);
   }
   #endregion

   

  ——多個方法的關聯

  就和命名方法一樣將多個匿名方法與同一個委托進行關聯是可能的這在很多情況下會非常有用——首先想到的是把一個簡單的處理程序添加給按鈕的點擊事件下面的代碼(示例)顯示了一個委托它同時帶有與之相關聯一個匿名方法和一個命名方法

  示例列表

  #region Multiple method association (stacking) Example
   privatedelegatevoidExample(string firstName string lastName);

   privatevoid btnExample_Click(object sender EventArgs e)
   {
       //Setup our parameters
       string parameter = Zach;
       string parameter = Smith;

       //Create an instance of the Example delegate with an
       // anonymous method
       Example example =
           newExample(
               delegate(string firstName string lastName)
               {
                   MessageBoxShow(Example: + firstName + + lastName);
               });

       //Add another method to the delegate this time
       // a named method
       example += newExample(ExampleNamedMethod);

       //Execute the delegate
       example(parameter parameter);
   }

   privatevoid ExampleNamedMethod(string firstName string lastName)
   {
       MessageBoxShow(ExampleMethod: + firstName + + lastName);
   }
   #endregion

  ——將匿名方法作為參數傳遞

  就和命名方法一樣將匿名方法作為參數傳遞給函數是可能的這並不是一個我認為會通常使用的特性但是我敢肯定未來會有這種需要下面的代碼()說明了這種類型的功能它將一個命名方法作為參數傳遞給了函數

  示例列表

  #region Passing anonymous methods Example
   privatedelegatevoidExample(string firstName string lastName);

   privatevoid btnExample_Click(object sender EventArgs e)
   {
       //Execute Passit and pass the anonymous method
       Passit((Example)delegate(string firstName string lastName)
               {
                   MessageBoxShow(Example: + firstName + + lastName);
               });

       //Execute Passit with the named method
       Passit(ExampleNamedMethod);
   }

   privatevoid ExampleNamedMethod(string firstName string lastName)
   {
       MessageBoxShow(ExampleMethod: + firstName + + lastName);
   }

   privatevoid Passit(Example example)
   {
       example(Zach Smith);
   }
   #endregion

  —-訪問類成員

  這是對上面的變量范圍的擴展但是這個例子()說明了匿名參數還能夠在它們的代碼塊之外執行命名方法

  示例列表

  #region Accessing class members Example
    privatedelegatevoidExample();

    privateint _customerId;
    privatestring _customerCode;

    publicint CustomerID
    {
        get { return _customerId; }
        set { _customerId = value; }
    }

    publicstring CustomerCode
    {
        get { return _customerCode; }
        set { _customerCode = value; }
    }

    privatevoid btnExample_Click(object sender EventArgs e)
    {
        //Populate out properties
        thisCustomerID = ;
        thisCustomerCode = HK;

        //Setup the delegate/anonymous method
        Example example =
            newExample(
                delegate
                {
                    thisShowCustomer(thisCustomerID thisCustomerCode);
                });

        //Execute the delegate
        example();

        //Change the properties
        thisCustomerID = ;
        thisCustomerCode = LM;

        //Execute the delegate again
        // Notice that the new values are reflected
        example();
    }

    privatevoid ShowCustomer(int customerId string customerCode)
    {
        MessageBoxShow(
            StringFormat(CustomerID: Customer Code:
                            customerId customerCode));
    }
    #endregion

  要注意的是我兩次調用了與匿名方法相關聯的委托你可能會發現一個很有趣的事情在這些調用中方法會輸出兩組不同的值這是因為用在匿名方法裡的外部變量在創建匿名方法的時候被引用這意味著對這些變量的任何更改都會在匿名函數訪問變量的時候被反映出來

  你可能還注意到在這個實例裡委托關鍵字後面沒有括號當匿名方法不需要帶參數的時候後面的括號是可選的

  評論

  我希望本文已經說明如何使用匿名方法雖然它們還不是革命性的但是它們是C#演化成為一門程序員友好的語言過程中的一個重要步驟

  (文/Zach Smith)


From:http://tw.wingwit.com/Article/program/net/201311/13844.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.