[C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法
目录
- 简介
- 匿名方法的参数使用范围
- 委托示例
简介
在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法。
而 C# 2.0 -- 引进了匿名方法,在 ≥ C# 3.0 的版本中,我们会用 Lambda 表达式进行取代匿名方法,并且用 Lambda 表达式作为编写内联代码的首选方式,因为它更简洁。
匿名方法是,顾名思义,匿名方法就是没有名称的方法。匿名方法最明显的好处就是:可以降低额外另写一个方法的工作量;另外一个好处就是可以直接访问调用者的变量,从而降低传参的复杂度。
匿名方法,它不是一个事先定义的方法,而是使用一个委托的代码块,在使用时,和普通方法并没有什么区别,但是匿名方法可以在一定程度上减少系统开销。
匿名方法,关键字:delegate。
匿名方法,使用场景:通常在,①需要一个临时的方法,并且该方法使用的次数极少;②该方法的代码很短,不长。
【注意】有一种情况,匿名方法它提供了 Lambda 表达式所没有具备的功能。 那就是,你可以使用匿名方法来忽略参数列表。 这意味着匿名方法可以转换为具有各种签名的委托,而这些,对于 Lambda 表达式来说,几乎是完全不可能的。
想要将代码块作为委托参数进行传递,使用匿名方法是目前唯一的方式。
示例一:
// 创建一个点击事件
button1.Click += delegate(Object o, EventArgs e)
{ MessageBox.Show("Click!"); };
示例二:
// 创建一个委托.
delegate void MyDel(int x); // 使用匿名方法并将委托实例化
MyDel del = delegate(int k) { /* ... */ };
使用匿名方法,由于无需单独额外创建方法,从而减少了上述两个示例实例化委托所需要的编码开销。
例如,如果创建方法所需的系统开销并不是必要的,则指定代码块(而不是委托)就会非常有用。
我在这里通过一个示例演示,如何用一个匿名方法的形式创建并启动一个新的线程:
//新建线程启动的示例
void Start()
{
//声明
Thread thread = new Thread
(delegate()
{
Write("Hello, ");
WriteLine("Fanguzai!");
}); //启动
thread.Start();
}
匿名方法的参数使用范围
匿名方法的参数使用范围:匿名方法块。
如果目标在块外部,你在匿名块内部使用 -- 跳转的关键字(类似 goto/break/continue),就是错误的;如果目标在块内部,你在匿名块外部使用 -- 跳转的关键字(类似 goto/break/continue),也是错误的。
如果局部变量和参数的范围已经包含匿名方法声明,则该局部变量和参数将被称为该匿名方法的“外部”(外界)变量。你看,这个代码段中的 num
就是一个外部(外界)变量:
int num = ;
MyDel del = delegate() { WriteLine("#:{0}", --num); };
这个外部变量的所引用的 num,将会
被认为是在创建委托时进行捕获的,它与我们常用的本地变量不同,这个外部变量的生存期 -- 引用该匿名方法的委托对象被 .NET 的 CLR 的垃圾回收机制进行回收。
【注意】匿名方法无法访问外部(外界)范围内,带 ref 与 out 关键字的参数。
【注意】在匿名块中不能访问 unsafe 的代码。
【注意】在 is 运算符的左边,是用不了匿名的方法的。
委托示例
下面的示例,将会同时使用匿名方法和命名方法去调用委托时:
// 声明委托
delegate void MyDel(string s); class MyClass
{
static void Main()
{
// 使用匿名方法实例化委托
MyDel p = delegate (string msg)
{
Console.WriteLine(msg);
}; // 直接调用
p("使用匿名方法调用委托。"); // 上面的形式再简写
p = Console.WriteLine;
Console.WriteLine("上面简写的形式"); // 使用"Do"的静态方法的委托实例化。
p = new MyDel(MyClass.Do);
// 使用旧的风格调用委托
p("使用命名方法调用委托。"); Console.Read();
} // 后续用于委托调用
static void Do(string msg)
{
Console.WriteLine(msg);
}
}
C# 基础回顾系列
《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》
《C# 知识回顾 - 事件入门》、《C# 知识回顾 - Event 事件》
《string 与 String,大 S 与小 S 之间没有什么不可言说的秘密》
《C# 知识回顾 - 你真的懂异常(Exception)吗?》
《了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数》
【博主】反骨仔
【出处】http://www.cnblogs.com/liqingwen/p/6216494.html
【参考】微软官方文档
[C#] C# 基础回顾 - 匿名方法的更多相关文章
- C# 知识回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- C#基础之匿名方法实例教程
本文以实例形式讲解了C#的匿名方法的用法,分享给大家供大家参考之用.具体如下: 匿名方法是C# 2.0的语言新特性.首先看个最简单的例子: class Program { static void Ma ...
- C#基础知识---匿名方法使用
一.匿名方法使用 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Tex ...
- 30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法
一:值类型/引用类型的区别 值类型主要包括简单类型,枚举类型,和结构体类型等,值类型的实例通常被分配在线程堆栈上面变量保存的内容是实例数据本身.引用类型被分配在托管堆上,变量保存的是地址.引 ...
- C#基础精华07(委托事件,委托的使用,匿名方法)
1.委托概述 委托是一种数据类型,像类一样(可以声明委托类型变量).方法参数可以是int.string.类类型 void M1(int n){ } √ void M2(string s){ } √ ...
- 四、Android学习第四天——JAVA基础回顾(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...
- [读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法.另外C#2.0还提出了可空类型,匿名方法和迭 ...
- C#学习笔记三: C#2.0泛型 可控类型 匿名方法和迭代器
前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法.另外C#2.0还提出了可空类型,匿名方法和迭 ...
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...
随机推荐
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- expect用法
1. [#!/usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西. 注意: ...
- 在Openfire上弄一个简单的推送系统
推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...
- Unity游戏内版本更新
最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...
- ExtJS 4.2 Date组件扩展:添加清除按钮
ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...
- 关于Raid0,Raid1,Raid5,Raid10的总结
RAID0 定义: RAID 0又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能.RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就 ...
- 强强联合,Testin云测&云层天咨众测学院开课了!
Testin&云层天咨众测学院开课了! 共享经济时代,测试如何赶上大潮,利用碎片时间给女票或者自己赚点化妆品钱? 2016年12月13日,Testin联手云层天咨带领大家一起推开众测的大门 ...
- Nginx学习笔记--001-Nginx快速搭建
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...
- canvas快速绘制圆形、三角形、矩形、多边形
想看前面整理的canvas常用API的同学可以点下面: canvas学习之API整理笔记(一) canvas学习之API整理笔记(二) 本系列文章涉及的所有代码都将上传至:项目代码github地址,喜 ...
- angular2之前端篇—1(node服务器分支)
上一篇.net core和angular2之前端篇-1 使用的是dotnet模板.之所以用它,因为想用他写webapi,但是写道下一篇的时候遇到点问题,所以先写个分支测试一下.这次是用Node作为服务 ...