zoukankan      html  css  js  c++  java
  • c# 匿名函数与托付

    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/han_yankun2009/article/details/26290779

       在 2.0之前的 C#版本号中,声明托付的唯一方法是使用命名方法 C# 2.0引入了匿名方法,而在 C# 3.0及更高版本号中,Lambda表达式代替了匿名方法,作为编写内联代码的首选方式。

    只是,本主题中有关匿名方法的信息相同也适用于 Lambda表达式。有一种情况下,匿名方法提供了 Lambda表达式中所没有的功能。

    可使用匿名方法来忽略參数列表。这意味着匿名方法可转换为具有各种签名的托付。这对于 Lambda表达式来说是不可能的。有关 lambda表达式的很多其它特定信息,參看MSDN

    注意Var类型的定义,匿名函数

    //匿名函数 
    var p1=new{Name="张三"。Age=28}。 
    var p2=new{Name="李四"。Age=29}; 
    var intArr=new[]{1,2,3。4。5};

       首先我们来看一下上面这段代码,比較简单。和我们平时定义一个实例基本没什么差别,仅仅是new后面没有跟详细定义的类型。这里我们使用newkeyword调用匿名初始化器创建了一个匿名类型对象;匿名类型直接继承自System.Object;匿名类型的成员是编译器依据初始化器判断而来的一些读写属性。

     

       这里我们注意到C#匿名函数基本上是配合隐式类型var来使用的。并且定义的顺序也是一定要注意,上面p1p2初始化时定义的属性名、类型和顺序一致,因此编译器觉得他们是同一个类型。能够使用p1=p2这种赋值语句。特别是顺序须要注意,假设初始化时名称类型一致而顺序不一致。则p1p2就是两个类型。假设使用p1=p2则编译时会抛出错误:无法将类型“AnonymousType#1”隐式转换为“AnonymousType#2” .定义匿名函数时还须要注意。不能用null赋初始值。


    以下我们看样例

     1 匿名函数与托付绑定

     

    在事件中使用匿名方法


    以下是一个定时器的小样例,我们常规的命名写法例如以下:

     

    class EventTest
        {
            public void Test()
            {
                System.Timers.Timer timersTimer =new System.Timers.Timer();
     
                timersTimer.Enabled = true;
                timersTimer.Interval = 5000;
                timersTimer.Elapsed += newSystem.Timers.ElapsedEventHandler(timersTimer_Elapsed);
                Console.ReadLine();
            }
     
            void timersTimer_Elapsed(object sender,System.Timers.ElapsedEventArgs e)
            {
               Console.WriteLine(System.DateTime.Now);
            }
        }

     

    对于事件的处理我们须要单独写一个方法timersTimer_Elapsed。那么假设使用匿名方法,则就能够省掉这种方法的定义,例如以下所看到的:

        

    class EventTest
        {
            public void Test()
            {
                System.Timers.Timer timersTimer =new System.Timers.Timer();
     
                timersTimer.Enabled = true;
                timersTimer.Interval = 5000;
                timersTimer.Elapsed +=
                    delegate(object sender,System.Timers.ElapsedEventArgs e)
                    {
                       Console.WriteLine(System.DateTime.Now);
                    };
                Console.ReadLine();
            }
        }

    也就是把方法的实现直接写在内部。


    匿名方法内部直接取得当前调用者的变量

    • 使托付与匿名方法关联。

    • 使托付与命名方法(DoWork)关联。

    delegate void Printer(string s);
    
    
    class TestClass
    {
        static void Main()
        {
            //1.使托付与匿名方法关联.
            Printer p = delegate(string j)
            {
                System.Console.WriteLine(j);
            };
            p("The delegate using the anonymous method is called.");
    
    
            //2.使托付与命名方法 (DoWork) 关联。

    p = new Printer(TestClass.DoWork); p("The delegate using the named method is called."); } static void DoWork(string k) { System.Console.WriteLine(k); } } /* Output: The delegate using the anonymous method is called. The delegate using the named method is called. */


    当然代码尽管看起来非常少。实际上编译器在编译时还是会生成其它方法的。也就是说匿名方法能够降低代码量,

    节省开发时间,可是对于性能方法没有什么提升的。


    小结:通过实例认识到,匿名函数能够简化代码,可是这个度还要依据自己的水平来判定,不然出了错误真是一个

    非常难的点。其次匿名函数在编译中并没有简化代码量。在生成时后台会生成一个类以及相似的方法。可是你若要

    将代码传递为托付參数,创建匿名方法则是唯一的方法。下篇Lambda表达式




  • 相关阅读:
    VS2005服务器资源管理器的bug ?
    今天新开张 ^_^
    SharePoint更改当前登录用户密码的WebPart
    开启SharePoint页面的Session功能
    创建强命名程序集的WebPart
    操作SSO对象模型时,异常“SSO_E_CANARY_VALIDATION_FAILURE”的处理
    关于页面加载时比较常用的几个公共事件
    活动目录概述
    SharePoint中利用客户端脚本获得当前登录用户信息
    SharePoint文档库中上下文菜单的菜单项
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10701028.html
Copyright © 2011-2022 走看看