C# 匿名方法(Anonymous Method)详解:从入门到实战,一文彻底掌握(附案例)
前言在学习 C# 委托Delegate和事件Event之后你会发现很多时候为了调用一个委托需要专门写一个方法。例如public static void SayHello() { Console.WriteLine(Hello); }然后再把它赋值给委托Action action SayHello; action();如果这个方法只会调用一次专门写一个方法就显得比较麻烦。因此C# 2.0 引入了匿名方法Anonymous Method。它允许不声明方法名称直接把方法体赋值给委托。后来的 Lambda 表达式其实就是匿名方法的升级版本。所以学习匿名方法就是学习 Lambda 的基础。一、什么是匿名方法微软官方定义匿名方法Anonymous Method是一种没有名称的方法可以直接作为委托实例进行定义。简单来说就是没有名字的方法。普通方法void Test() { Console.WriteLine(Hello); }匿名方法delegate() { Console.WriteLine(Hello); };它没有方法名返回类型由委托决定参数类型由委托决定只保留方法体二、为什么要使用匿名方法假设有一个委托delegate void MyDelegate();传统写法class Program { static void Main() { MyDelegate md Print; md(); } static void Print() { Console.WriteLine(Hello C#); } }输出Hello C#如果 Print() 只调用一次为什么还要单独写一个方法匿名方法MyDelegate md delegate () { Console.WriteLine(Hello C#); }; md();是不是更简单三、匿名方法语法完整语法delegate(参数) { 方法体; };例如delegate(int x) { Console.WriteLine(x); }赋值给委托delegate void MyDelegate(int x); MyDelegate md delegate (int num) { Console.WriteLine(num); }; md(100);输出100四、匿名方法与普通方法对比普通方法匿名方法有方法名没有方法名可以重复调用一般只调用一次可读性高简洁可以独立存在必须依附委托示例普通void Show() { Console.WriteLine(Hello); }匿名delegate () { Console.WriteLine(Hello); };五、匿名方法示例示例1无参数delegate void MyDelegate(); class Program { static void Main() { MyDelegate md delegate () { Console.WriteLine(匿名方法); }; md(); } }输出匿名方法示例2带参数delegate void MyDelegate(string name); class Program { static void Main() { MyDelegate md delegate (string name) { Console.WriteLine(你好 name); }; md(Tom); } }输出你好Tom示例3有返回值delegate int MyDelegate(int a, int b); class Program { static void Main() { MyDelegate add delegate (int x, int y) { return x y; }; Console.WriteLine(add(3, 5)); } }输出8六、匿名方法访问外部变量闭包匿名方法最大的特点可以访问外部变量。例如int number 100; Action action delegate () { Console.WriteLine(number); }; action();输出100甚至可以修改int number 100; Action action delegate () { number; }; action(); Console.WriteLine(number);输出101这种机制叫闭包ClosureLambda 也是利用闭包实现的。七、匿名方法在 List 中使用例如Listint list new Listint() { 10,20,30,40,50 }; list.ForEach(delegate(int item) { Console.WriteLine(item); });输出10 20 30 40 50如果不用匿名方法void Print(int item) { Console.WriteLine(item); } list.ForEach(Print);显然匿名方法更方便。八、匿名方法结合事件例如按钮点击button.Click delegate { Console.WriteLine(按钮被点击); };WinForms 中非常常见。WPFbutton.Click delegate (object sender, EventArgs e) { Console.WriteLine(点击); };九、匿名方法与 Lambda 表达式匿名方法delegate(int x) { return x * 2; };Lambdax x * 2;实际上Lambda 就是匿名方法的简化写法。例如匿名方法Funcint,int fun delegate(int x) { return x * 2; };LambdaFuncint,int fun x x * 2;执行Console.WriteLine(fun(10));输出20所以现在项目中Lambda 使用远远多于匿名方法。十、匿名方法 VS Lambda对比项匿名方法Lambda出现版本C# 2.0C# 3.0是否有方法名无无代码量较多更少可读性一般更高是否支持 LINQ不方便非常方便是否推荐一般⭐⭐⭐⭐⭐十一、匿名方法的优点✔ 不需要声明方法✔ 代码更简洁✔ 一次性逻辑非常方便✔ 能访问外部变量✔ 事件中非常常见✔ 委托代码更集中十二、匿名方法的缺点❌ 方法体太长时可读性差❌ 无法重复利用❌ 调试不如普通方法方便❌ 已逐渐被 Lambda 取代十三、开发中的应用场景1、按钮点击事件button.Click delegate { MessageBox.Show(点击成功); };2、线程Thread t new Thread(delegate () { Console.WriteLine(线程开始); }); t.Start();3、TaskTask.Run(delegate () { Console.WriteLine(执行任务); });4、List 排序list.Sort(delegate(int x, int y) { return x.CompareTo(y); });5、集合遍历list.ForEach(delegate(int item) { Console.WriteLine(item); });十四、面试常见问题Q1什么是匿名方法答匿名方法是没有名称的方法通常直接赋值给委托用于简化一次性的回调逻辑。Q2匿名方法和 Lambda 有什么关系答Lambda 是匿名方法的简化语法功能更强、代码更简洁是现代 C# 开发中的首选写法。Q3匿名方法可以访问外部变量吗答可以。匿名方法支持闭包Closure能够读取并修改外部变量但需要注意变量生命周期和循环变量捕获等问题。Q4匿名方法一定要依附委托吗答是的。匿名方法不能独立存在它必须赋值给委托或兼容的委托类型如Action、Func才能使用。十五、学习总结匿名方法是 C# 为简化委托调用而引入的重要特性它省去了单独定义方法的步骤使一次性的回调逻辑更加紧凑。虽然在现代 C# 开发中Lambda 表达式已经成为主流但匿名方法仍然有助于理解委托、事件和闭包等核心概念。掌握匿名方法后你将能够更轻松地学习 LINQ、异步编程以及事件驱动开发为后续深入学习现代 C# 打下坚实基础。本文知识点总结掌握匿名方法的概念与语法理解匿名方法与委托之间的关系学会编写带参数、带返回值的匿名方法理解闭包Closure的基本原理掌握匿名方法在事件、集合、线程和任务中的应用能够区分匿名方法与 Lambda 表达式并理解它们的演进关系

相关新闻