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来使用的。并且定义的顺序也是一定要注意,上面p1和p2初始化时定义的属性名、类型和顺序一致,因此编译器觉得他们是同一个类型。能够使用p1=p2这种赋值语句。特别是顺序须要注意,假设初始化时名称类型一致而顺序不一致。则p1和p2就是两个类型。假设使用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();
}
}
也就是把方法的实现直接写在内部。
2 匿名方法内部直接取得当前调用者的变量
- 使托付与匿名方法关联。
- 使托付与命名方法(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表达式
c# 匿名函数与托付的更多相关文章
- JavaScript匿名函数与托付
<1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <!-- C#匿名函数--& ...
- Unity 之 C# 利用回调函数实现C++匿名函数
做C++开发的都用过匿名函数很好用,可是C#开发怎么实现呢?前几天做一个拍照功能的时候.我偶然发现某个函数假设是C++的话.用匿名函数太好了,于是開始研究C#的回调,代理.托付等,最后总算是实现了我想 ...
- 冒泡,setinterval,背景图的div绑定事件,匿名函数问题
1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...
- Javascript之匿名函数
分析: 1.所谓匿名函数,从字面意思理解,就是没有名字的函数,js 用()来代替(注意,是英文状态下的括号) 2.定义形式: function (){ //to add codes that you ...
- 巧用javascript对象属性,向事件绑定的匿名函数内传递循环控制变量的值
遇到一个需要向匿名函数传递循环控制变量的问题,我受到园子里这篇文章的启发[笔记]js获取当前点击元素的索引,解决了这个问题.现在把代码贴出来,以防止自己忘记. if ($('#labModal').l ...
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...
- 委托,匿名函数和lambda表达式
很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一 ...
- Javascript自执行匿名函数(function() { })()的原理分析
匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数 下面是一个最常见的自执行函数: // 传统匿名函数 (function() { alert('hell ...
- 一篇关于匿名函数(function(){})()不错的文章
代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他 ...
随机推荐
- DOM-使用节点
节点类型 DOM规定:整个文档是一个文档节点,每个标签是一个元素节点,元素包含的文本是文本节点,元素的属性是一个属性节点,注释属于注释节点,如此等等: 每个节点都有一个nodeType属性,用于标明节 ...
- 转载:SQL按照日、周、月、年统计数据的方法
转载源:http://www.jb51.net/article/42613.htm SQL按照日.周.月.季度.年统计数据的方法 方式一: --按日 select sum(consume),day([ ...
- JS中的事件冒泡——总结
一. 有话要说 事件冒泡这个话题已经被园子里的朋友说透了,已经没什么要讲的了,但是由于呢我这边有个小问题刚好跟这个事件冒泡有关,就突然性想写个总结:一方面是给自己增加印象,另一方面给园子的新手们,提供 ...
- macbook usb口突然不能用 解决方法
1.先按shift+ctrl+opt+开机键,等待10秒,着10秒是没有反应的,屏幕不会亮,系统不会跑起来.2.10秒过后松开所以的键.3.再按opt+cmd+r+p接着按开机键,这时电脑会不断重启, ...
- 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)
题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...
- 原 java调整数据顺序是奇数位于偶数的前面(思路与实现)
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 思路一: 首先这 ...
- ios移动端禁止双指缩放功能
在实际开发中,我们禁止缩放的实现方式: 1.meta设置: <meta name="viewport" content="width=device-width,h ...
- dojox.grid.DataGrid显示数据的方法(转)
第一种:数据存在本地或者已经写死的JSON对象中,不需要跟服务端进行数据传输 <%@ page language="java" contentType="text/ ...
- Kubernetes核心概念简介
本文将会简单介绍Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概 ...
- 矩阵分解---QR正交分解,LU分解
相关概念: 正交矩阵:若一个方阵其行与列皆为正交的单位向量,则该矩阵为正交矩阵,且该矩阵的转置和其逆相等.两个向量正交的意思是两个向量的内积为 0 正定矩阵:如果对于所有的非零实系数向量x ,都有 x ...