在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 = ;
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(); Console.ReadKey();
} }

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

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

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

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


JavaScript中的函数和C#中的匿名函数(委托、lambda表达式)的更多相关文章

  1. js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)

    js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...

  2. C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=.答案是6个Firs ...

  3. 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  4. (转)C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  5. [No0000134]C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  6. 【转】C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  7. 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

    引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...

  8. 泛型委托及委托中所涉及到匿名方法、Lambda表达式

    泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...

  9. 匿名方法,Lambda表达式,高阶函数

    原文:匿名方法,Lambda表达式,高阶函数 匿名方法 c#2.0引入匿名方法,不必创建单独的方法,因此减少了所需的编码系统开销. 常用于将委托和匿名方法关联,例如1. 使用委托和方法关联: this ...

  10. 洗礼灵魂,修炼python(25)--自定义函数(6)—从匿名函数进阶话题讲解中解析“函数式编程”

    匿名函数进阶 前一章已经说了匿名函数,匿名函数还可以和其他内置函数结合使用 1.map map():映射器,映射 list(map(lambda x:x*2,range(10))) #把range产生 ...

随机推荐

  1. 20个必不可少的Python库

    转载:http://www.python123.org/tutorials/58b41f2a28c8f30100bd41dc 读者们好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之 ...

  2. python3编写网络爬虫17-验证码识别

    一.验证码识别 1.图形验证码的识别 识别图形验证码需要 tesserocr 库 OCR技术识别(光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程.)例如 中国知网注册页面 ht ...

  3. orcFile split和读数据原理总结(hive0.13)

    http://blog.csdn.net/zhaorongsheng/article/details/72903431 官网关于orcfile的介绍 背景 Hive的rcfile格式已经使用多年,但是 ...

  4. jquery中prop()和attr()用法

    jquery1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. 大家都知道有的浏览器只要写disabled,checked就可以了,而有的 ...

  5. 前端性能优化成神之路-HTTP压缩开启gzip

    什么是HTTP压缩 HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法. HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件. 能大大减少 ...

  6. Python3新特性 类型注解 以及 点点点

    Python3新特性 类型注解 以及 点点点 ... Python3 的新特性 Python 是一种动态语言,变量以及函数的参数是 不区分类型 的 在 函数中使用类型注解 相当于 给 形参的 类型 设 ...

  7. java的回调

    java的回调 1,明确什么是回调方法 2,采用接口来实现回调 java同步回调 一个类实现了接口,将他传递给另一个类,在另一个类调用接口中方法 public class Bar implements ...

  8. Md5的生成

    1.使用hashlib包(一) import hashlib src = 'anthing' m1 = hash.new() m1.update(src) print (m1.hexdigest()) ...

  9. Tmux的快捷键

    Ctrl+b 激活控制台:此时以下按键生效 系统操作 ? 列出所有快捷键:按q返回 d 脱离当前会话:这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 D 选择要脱离的 ...

  10. java爬虫代理

    public static Document getDocByJsoups(String href) { String ip = "124.47.7.38"; int port = ...