C# 匿名方法基础回顾
作者:反骨仔(二五仔) 发布时间:2023-02-27 13:59:23
目录
简介
匿名方法的参数使用范围
委托示例
简介
在 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 = 250;
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);
}
}
来源:http://www.cnblogs.com/liqingwen/p/6216494.html


猜你喜欢
- 前言 Spring中最重要的概念IOC和AOP,实际围绕的就是Bean的生成与使用。什么叫做Bean呢?
- 理论上Object类是所有类的父类,即直接或间接的继承java.lang.Object类。由于所有的类都继承在Object类,因此省略了ex
- 大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来
- 本文实例为大家分享了java验证码生成的具体代码,供大家参考,具体内容如下简单验证码java实现--servlet类生成 验证码img,并写
- 前言最近一段时间看了一些介绍ViewDragHelper的博客,感觉这是一个处理手势滑动的神奇,看完以后就想做点东西练练手,于是就做了这个A
- 本文实例讲述了Android中WebView用法。分享给大家供大家参考,具体如下:WebView相当于一个迷你浏览器,采用WebKit内核,
- 蔡勒公式 蔡勒(Zeller)公式:是一个计算星期的公式。随便给一个日期,就能用这个公式推算出是星期几。蔡勒公式如下:W = [
- 目录一、新建简单窗口二、编写窗口中的按键三、简单的按键运行1.流布局管理器:2.静态文本框:四、窗口画图五、窗口鼠标响应六、总结好了,sto
- 警告消息框主要是用来向用户户展示诸如警告、异常、完成和提示消息。一般实现的效果就是从系统窗口右下角弹出,然后加上些简单的显示和消失的动画。创
- Java集合ArrayDeque类实例分析前言ArrayDeque类是双端队列的实现类,类的继承结构如下面,继承自AbastractColl
- 所谓回调,就是客户程序C调用服务程序S中的某个方法A,然后S又在某个时候反过来调用C中的某个方法B,对于C来说,这个B便叫做回调方法。下面看
- 前言:这里记录了我在学习Skyline二次开发中所遇到的问题,适合刚接触Skyline二次开发的同学查看使用,从逻辑到代码逐一详解,但是还是
- 希尔排序是插入排序的一种,又称"缩小增量排序”,是插入排序算法的一种更高效的改进版本。希尔排序原理1.选定一个增长量h,按照增长量
- System.Collections.ArrayList类是一个特殊的数组。通过添加和删除元素,就可以动态改变数组的长度。一.优点1. 支持
- 目录springboot中定时任务的创建springboot通过注解创建定时任务首先引入pom直接上代码来一个栗子@Scheduled注解的
- 用来记录自己所用到的知识前两天在做项目的时候发现有时候在访问网络数据的时候由于后台要做的工作较多,给我们返回数据的时间较长,所以老大叫我加了
- MongoDBMongoDB作为一种NoSQL数据库产品,其实已经非常著名了。去年,由于MongoDB安全认证的薄弱,上万家公司中招。虽然是
- 一、首先在主布局中,用帧布局来填充 RecycleView 和 两个模拟发送消息的Button<?xml version="
- 定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。类型:行为类
- 一、项目简述环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,