C# 匿名方法基础回顾
发布时间 - 2026-01-10 22:17:38 点击率:次目录

- 简介
- 匿名方法的参数使用范围
- 委托示例
简介
在 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);
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# C#
# 匿名方法
# C#实现读取匿名对象属性值的方法示例总结
# C#警惕匿名方法造成的变量共享实例分析
# C#用匿名方法定义委托的实现方法
# C#实现在匿名方法中捕获外部变量的方法
# C#基础之匿名方法实例教程
# C#中的匿名方法实例解析
# c# 匿名方法的小例子
# C#中匿名方法与委托的关系介绍
# 将会
# 你在
# 跳转
# 创建一个
# 是一个
# 就会
# 是在
# 不可能
# 你可以
# 有一种
# 你看
# 所需
# 并将
# 将被
# 可以直接
# 因为它
# 顾名思义
# 另外一个
# 在一
# 会用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
Thinkphp 中 distinct 的用法解析
教学论文网站制作软件有哪些,写论文用什么软件
?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
java中使用zxing批量生成二维码立牌
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
如何在IIS中配置站点IP、端口及主机头?
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
动图在线制作网站有哪些,滑动动图图集怎么做?
Android利用动画实现背景逐渐变暗
如何快速生成可下载的建站源码工具?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
EditPlus中的正则表达式实战(5)
IOS倒计时设置UIButton标题title的抖动问题
如何在云指建站中生成FTP站点?
网站制作价目表怎么做,珍爱网婚介费用多少?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何用搬瓦工VPS快速搭建个人网站?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何在阿里云ECS服务器部署织梦CMS网站?
微信小程序 HTTPS报错整理常见问题及解决方案
Laravel如何创建自定义Facades?(详细步骤)
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
如何用5美元大硬盘VPS安全高效搭建个人网站?
实例解析angularjs的filter过滤器
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Laravel安装步骤详细教程_Laravel环境搭建指南
JS经典正则表达式笔试题汇总
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
如何在香港免费服务器上快速搭建网站?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
详解CentOS6.5 安装 MySQL5.1.71的方法
三星、SK海力士获美批准:可向中国出口芯片制造设备
WEB开发之注册页面验证码倒计时代码的实现
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
中国移动官方网站首页入口 中国移动官网网页登录
如何注册花生壳免费域名并搭建个人网站?
浅谈javascript alert和confirm的美化
教你用AI将一段旋律扩展成一首完整的曲子
如何在VPS电脑上快速搭建网站?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
googleplay官方入口在哪里_Google Play官方商店快速入口指南
敲碗10年!Mac系列传将迎来「触控与联网」双革新
如何在云虚拟主机上快速搭建个人网站?

