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表达式




  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10701028.html
Copyright © 2011-2022 走看看