zoukankan      html  css  js  c++  java
  • JavaScript中的函数和C#中的匿名函数(委托、lambda表达式)

    在js中function是一个一个引用类型,所以可以出现这样的代码:

    'use strict';
    var compare=function(value1, value2) {
        if (value1<value2) {
            return -1;
        }
        else if (value1>value2) {
            return 1;
        } else {
            return 0;
        }
    }
    var arr = [1, 2, 4, 6, 3, 4];
    arr.sort(compare);//可以直接传递一个函数名给这个方法作为参数。
    console.log(arr); 

    这种在js里面很平常的用法,在c#里面是不被允许的,在c#中方法是一个类中存放数据处理逻辑的地方,谈不上是一个引用类型,在c#中相似的用法是委托。看下面的例子:

     public delegate void DoSomeThingElse(int number);
            static void Main(string[] args)
            {
                DoSomeThingElse delegateDo = null;
                FuncDoSomeThingElse(delegateDo);//主要是这里,实现了和js一样的功能,可以直接传入一个方法体
                Console.ReadKey();
            }
    
            public static void FuncDoSomeThingElse(DoSomeThingElse toDo)
            {
                var number = 1;
                toDo += Person.DoSomeThing;
                toDo(number);
            }
    
            
        }
    
        public class Person
        {
            public static void DoSomeThing(int number)
            {
                Console.WriteLine(number);
            }
        }

        可以看出如果要在C#中使用与js中一样的功能是非常困难的,首先要定义一个方法,在这个例子中是在person这个类中定义了一个DoSomeThing的方法,接受一个number参数。第二步是定义一个方法去接受一个委托的方法(

    FuncDoSomeThingElse),这方法中对委托进行操作,这个例子中是利用toDo += Person.DoSomeThing;这条语句在内部调用delegate的combine方法将person的DoSomeThing方法加入到了委托链中。接下来在main方法中对委托进行实例化.....总之心很累。
    C#3中加入了匿名委托:
    class Program
        {
            public delegate void DoSomeThingElse(int number);
            static void Main(string[] args)
            {
                DoSomeThingElse dooo = delegate (int shit)
                  {
                      Console.WriteLine(shit);
                  };
                dooo(5);
                
                Console.ReadKey();
            }
    
           
    
    
        }

        看一下已经变得清爽了许多,不需要在因为一个方法而去创建一个类来包容了,直接一个delegate(){}的表达式来搞定。但是这样的写法还是阅读起来不是很顺畅,虽然已经清爽了很多,于是在C#3.5C#4中添加的lambda表达式使得这种行为更加的简单了:

     class Program
        {
           
            static void Main(string[] args)
            {
                Action<int> dooo =a=> Console.WriteLine(a);
                dooo(5);
                
                Console.ReadKey();
            }    
        }

        是不是爽爆了?这里出现的新东西是Action和=>,Action表示一个内建的委托,还有一个是Func,还有一个是Predicate,表达的意思不一样,但是这三种内建的委托基本能够代表所有的委托类型了。所以,连delegate这个东西都可以丢掉了。=>表达的意思是这是一个lambda表达式,在这个符号的左边是传入的参数,如果有多个参数的话可以用圆括号括起来。右边是方法体,如果有多行语句的话还可以在这个符号的右边加上一个花括号。

        lambda表达式这个东西是编译器帮助我们做了很多的事情,在后台,编译器为方法体建立一个包容的类来放置这个方法体,闭包也和这个东西有关系,闭包直观的说就是因为匿名函数引用了局部变量而引起的一种行为。这个是后话。

    
    
  • 相关阅读:
    ubuntu
    ubuntu
    ubuntu14.04,安装Gnome 15.10 (桌面)
    ubuntu14.04,安装Gnome 15.10 (桌面)
    Ubuntu 14.04.3 LTS如何安装谷歌输入法
    Ubuntu 14.04.3 LTS如何安装谷歌输入法
    ubuntu 安装 删除 卸载 Deb 包文件
    失去爆破音规律
    单词发音规律
    英式音标和美式音标的差异
  • 原文地址:https://www.cnblogs.com/pangjianxin/p/7743886.html
Copyright © 2011-2022 走看看