C#2.0新增功能03 匿名方法
在 2.0 之前的 C# 版本中,声明委托的唯一方式是使用命名方法。 C# 2.0 引入匿名方法,在 C# 3.0 及更高版本中,Lambda 表达式取代匿名方法作为编写内联代码的首选方式。 但是,本主题中有关匿名方法的信息也适用于 Lambda 表达式。 在有一种情况下,匿名方法提供 Lambda 表达式中没有的功能。 使用匿名方法可省略参数列表。 这意味着匿名方法可转换为具有多种签名的委托。 Lambda 表达式无法实现这一点。 有关 Lambda 表达式的详细信息,请参阅 Lambda 表达式。
创建匿名方法实际上是一种将代码块作为委托参数传递的方式。 这里是两个示例:
// 为单击事件创建处理程序 button1.Click += delegate(System.Object o, System.EventArgs e) { System.Windows.Forms.MessageBox.Show("Click!"); };
// 创建一个委托. delegate void Del(int x); // 使用匿名方法实例化委托 Del d = delegate(int k) { /* ... */ };
由于使用匿名方法无需创建单独的方法,因此可减少对委托进行实例化的编码开销。
例如,在因不得不创建方法而可能出现非必要开销的情况下,指定代码块(而不是委托)很有用处。 开始新线程就是一个很好的示例。 此类创建一个线程,且还包含该线程执行的代码,而无需为委托创建其他方法。
void StartThread() { System.Threading.Thread t1 = new System.Threading.Thread (delegate() { System.Console.Write("Hello, "); System.Console.WriteLine("World!"); }); t1.Start(); }
备注
匿名方法的参数范围为匿名方法块。
如果目标在匿名方法块之外,匿名方法块内具有 goto、break 或 continue 等跳转语句是一种错误。 如果目标在匿名方法块之内,匿名方法块外具有 goto
、break
或 continue
等跳转语句也是一种错误。
范围包含匿名方法声明的本地变量和参数称为此匿名方法的外部变量。 例如,在如下代码段中,n
是一个外部变量:
int n = 0; Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };
创建委托时,对外部变量 n
的引用被视为已捕获。 不同于本地变量,已捕获的变量的生存期一直延伸至引用匿名方法的委托具有垃圾回收资格为止。
匿名方法无法访问外部范围的 in、ref 或 out 参数。
无法在匿名方法块内访问任何不安全代码。
不允许在 is 运算符左侧使用匿名方法。
示例
如下示例演示实例化委托的两种方式:
-
将委托与匿名方法相关联。
-
将委托与命名方法 (
DoWork
) 相关联。
在每一种情况下,调用委托时均显示一条消息。
// 定义委托. delegate void Printer(string s); class TestClass { static void Main() { // 使用匿名方法实例化委托类型 Printer p = delegate(string j) { System.Console.WriteLine(j); }; // 匿名委托调用的结果 p("The delegate using the anonymous method is called."); // 使用命名方法“DoWork”的委托实例化 p = DoWork; // 传统方式委托调用的结果 p("The delegate using the named method is called."); } // 与命名委托关联的方法。 static void DoWork(string k) { System.Console.WriteLine(k); } } /* 输出: The delegate using the anonymous method is called. The delegate using the named method is called. */
其他更详细的技术请参考:
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!