知识大全 如何充分利用C#匿名方法的平台优势

Posted 变量

篇首语:学如逆水行舟,不进则退。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何充分利用C#匿名方法的平台优势相关的知识,希望对你有一定的参考价值。

如何充分利用C#匿名方法的平台优势  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在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 I m using the anonymous        // method in place of a named method it follows        // the delegate() keyword         Example example =            newExample (                delegate()                                    MessageBox Show( 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()                    MessageBox Show(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)                                  MessageBox Show( 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)                                  MessageBox Show( Example : + firstName + + lastName);               );       //Add another method to the delegate this time       // a named method        example += newExample (Example NamedMethod);       //Execute the delegate        example(parameter parameter );      privatevoid Example NamedMethod(string firstName string lastName)          MessageBox Show( Example Method: + 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)                                  MessageBox Show( Example : + firstName + + lastName);               );       //Execute Passit with the named method        Passit(Example NamedMethod);      privatevoid Example NamedMethod(string firstName string lastName)          MessageBox Show( Example Method: + 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         this CustomerID = ;        this CustomerCode = HK ;        //Setup the delegate/anonymous method         Example example =            newExample (                delegate                                    this ShowCustomer(this CustomerID this CustomerCode);                );        //Execute the delegate         example();        //Change the properties         this CustomerID = ;        this CustomerCode = L M ;        //Execute the delegate again         // Notice that the new values are reflected         example();        privatevoid ShowCustomer(int customerId string customerCode)            MessageBox Show(            String Format( CustomerID: Customer Code:                             customerId customerCode));        #endregion

  要注意的是 我两次调用了与匿名方法相关联的委托 你可能会发现一个很有趣的事情 在这些调用中 方法会输出两组不同的值 这是因为用在匿名方法里的外部变量在创建匿名方法的时候被引用 这意味着对这些变量的任何更改都会在匿名函数访问变量的时候被反映出来

  你可能还注意到在这个实例里委托关键字后面没有括号 当匿名方法不需要带参数的时候 后面的括号是可选的

  评论

  我希望本文已经说明如何使用匿名方法 虽然它们还不是革命性的 但是它们是C#演化成为一门程序员友好的语言过程中的一个重要步骤

cha138/Article/program/net/201311/13844

相关参考

知识大全 C#中的匿名类型与隐式类型变量

C#中的匿名类型与隐式类型变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在C#中引入了Li

知识大全 了解C#特性匿名类型与隐式类型局部变量

了解C#特性匿名类型与隐式类型局部变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

知识大全 新增匿名类[1]

  一用var定义变量  在C#中提供了一种新的声明变量的方式这就是var通过这个关键字在声明变量时就无需指定类型了变量类型是在初始化时由编译器确定的代码如下:varss=abcd;MessageBo

知识大全 C#体验Microsoft.NET平台基础构造

C#体验Microsoft.NET平台基础构造  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!抛开M

智能配电网的优势有哪些?

智能配电网目前已经成为电力行业中重要的电网,这种智能电网具有很好的稳定性,停电的概率也降低了很多,还可以将资源得到充分利用。具有这么多的优点的电网到底是什么样的?下面就来看一下什么是智能配电网。智能配

智能配电网的优势有哪些?

智能配电网目前已经成为电力行业中重要的电网,这种智能电网具有很好的稳定性,停电的概率也降低了很多,还可以将资源得到充分利用。具有这么多的优点的电网到底是什么样的?下面就来看一下什么是智能配电网。智能配

早茬春芝麻高产栽培技术

利用碗豆、油菜、大麦等早茬作物种植芝麻,在我区有一定的面积,是芝麻生产上的一大优势。但是在管理上仍按夏芝麻的一套管理办法,使早茬芝麻的潜再优势未能得到充分的发挥,产量并不十分理想。为了充分发挥其增产潜

早茬春芝麻高产栽培技术

利用碗豆、油菜、大麦等早茬作物种植芝麻,在我区有一定的面积,是芝麻生产上的一大优势。但是在管理上仍按夏芝麻的一套管理办法,使早茬芝麻的潜再优势未能得到充分的发挥,产量并不十分理想。为了充分发挥其增产潜

早茬春芝麻高产的栽培技术

利用碗豆、油菜、大麦等早茬作物种植芝麻,在我区有一定的面积,是芝麻生产上的一大优势。但是在管理上仍按夏芝麻的一套管理办法,使早茬芝麻的潜再优势未能得到充分的发挥,产量并不十分理想。为了充分发挥其增产潜

早茬春芝麻高产的栽培技术

利用碗豆、油菜、大麦等早茬作物种植芝麻,在我区有一定的面积,是芝麻生产上的一大优势。但是在管理上仍按夏芝麻的一套管理办法,使早茬芝麻的潜再优势未能得到充分的发挥,产量并不十分理想。为了充分发挥其增产潜