匿名方法(Anonymous Methods)

ExpressLRS 915MHz vs 2.4GHz:实测对比与TX12遥控器的最佳搭配方案 本文深入对比了ExpressLRS 915MHz与2.4GHz两种频段在穿透能力、延迟、抗干扰等方面的实测表现,并结合RadioMaster TX12遥控器的硬件特性,提供了从微型花飞到极限远航等不同场景下的最佳搭配方案与EdgeTX系统配置指南,帮助FPV玩家根据核心飞行需求做出精准选择。 阅读详情
C# 2.0引入了很多语言扩展,最重要的就是泛型(Generics)、匿名方法(Anonymous Methods)、迭代器
(Iterators)和不完全类型(Partial Types)。
【一、什么是匿名方法】
● 匿名方法允许在需要委托值时能够以“内联(in-line)”的方式书写代码块。匿名方法与Lisp语言
中的拉姆达函数(lambda functions)类似。以下为msdn对匿名方法的解释。

在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法。

要将代码块传递为委托参数,创建匿名方法则是唯一的方法。例如:

// Create a handler for a click event
button1.Click += delegate(System.Object o, System.EventArgs e)
{ System.Windows.Forms.MessageBox.Show("Click!"); };

// Create a delegate instance
delegate void Del(int x);

// Instantiate the delegate using an anonymous method
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();
}
匿名方法的参数的范围是 anonymous-method-block

在 目标在块外部 的匿名方法 块内 使用跳转语句(如 gotobreakcontinue)是错误的。在 目标在块内部 的匿名方法块外部 使用跳转语句(如 gotobreakcontinue)也是错误的。

如果局部变量和参数的范围包含匿名方法声明,则该局部变量和参数称为该匿名方法的外部变量或捕获变量。例如,下面代码段中的 n 即是一个外部变量:

int n = 0;
Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };

与局部变量不同,外部变量的生命周期一直持续到引用该匿名方法的委托符合垃圾回收的条件为止。对 n 的引用是在创建该委托时捕获的。
匿名方法不能访问外部范围的 refout 参数。
anonymous-method-block 中不能访问任何不安全代码。

【匿名方法】
  没有匿名方法之前,我们处理方法和回调方法通常是先显示声明一个专门的委托然后再通过委托调用,而非直接调用方法。所以迄今为止我们还只能将一个实践处理和回调的代码放在一个具体的方法中再为其显式地建立委托。相反,
匿名
方法(anonymous methods)允许将与一个委托关联的代码“内联(in-line)”到使用委托的地方,我们可以很方便地将代码直接写在委托实例中。除了看起来舒服,匿名方法还共享对本地语句所包含的函数成员的访问。如果想在命名方法(区别于匿名方法)中达成这种共享,需要手动创建一个辅助类并将本地成员“提升(lifting)”到这个类的域中。(其实就是将委托的代码直接置换到使用委托的地方,这样就不用再实例化委托,从而节省编码系统开销)
下面的例子展示了从一个包含一个列表框、一个文本框和一个按钮的窗体中获取一个简单的输入。
当按钮按下时文本框中的文本会被添加到列表框中。
class InputForm: Form
{
ListBox listBox;
TextBox textBox;
Button addButton;
public MyForm() {
listBox = new ListBox(...);
textBox = new TextBox(...);
addButton = new Button(...);
addButton.Click += new EventHandler(AddClick);
}
void AddClick(object sender, EventArgs e) {
listBox.Items.Add(textBox.Text);
}
}
尽管对按钮的Click事件的响应只有一条语句,这条语句也必须放到一个独立的具有完整的参数列表的方法中,并且要手动创建引用该方法的EventHandler委托。使用匿名方法,事件处理的代码会变得更加简洁:
class InputForm: Form
{
ListBox listBox;
TextBox textBox;
Button addButton;
public MyForm() {
listBox = new ListBox(...);
textBox = new TextBox(...);
addButton = new Button(...);
addButton.Click += delegate {
listBox.Items.Add(textBox.Text);
};
}
}
一个匿名方法由关键字delegate一个可选的参数列表组成,并将语句放入“{”和“}”限定符中。前面例子中的匿名方法没有使用提供给委托的参数,因此可以省略参数列表。要想访问参数,你名方法应该包含一个参数列表:
addButton.Click += delegate(object sender, EventArgs e) {
MessageBox.Show(((Button)sender).Text);
};
上面的例子中,在匿名方法和EventHandler委托类型(Click事件的类型)之间发生了一个隐式的转换。这个隐式的转换是可行的,因为这个委托的参数列表和返回值类型和匿名方法是兼容的。精确的兼容规则如下:
? 当下面条例中有一条为真时,则委托的参数列表和匿名方法是兼容的:
o 匿名方法没有参数列表且委托没有输出(out)参数。(匿名方法无参,且委托为out)
o 匿名方法的参数列表在参数数目、类型和修饰符上与委托参数精确匹配。(匿名方法与委托在参数数目,类型,修饰符完全一样)
? 当下面的条例中有一条为真时,委托的返回值与匿名方法兼容:
o 委托的返回值类型是void且匿名方法没有return语句或其return语句不带任何表达式。
o 委托的返回值类型不是void但和匿名方法的return语句关联的表达式的值可以被显式地转换为委
托的返回值类型。
只有参数列表和返回值类型都兼容的时候,才会发生匿名类型向委托类型的隐式转换。
下面的例子使用了匿名方法对函数进行了“内联(in-lian)”。匿名方法被作为一个Function委托类型传递。
using System;
delegate double Function(double x);
class Test
{
static double[] Apply(double[] a, Function f) {
double[] result = new double[a.Length];
for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
return result;
}
static double[] MultiplyAllBy(double[] a, double factor) {
return Apply(a, delegate(double x) { return x * factor; });
}
static void Main() {
double[] a = {0.0, 0.5, 1.0};
double[] squares = Apply(a, delegate(double x) { return x * x; });
double[] doubles = MultiplyAllBy(a, 2.0);
}
}
Apply方法需要一个给定的接受double[]元素并返回double[]作为结果的Function。在Main方法中,传递给Apply方法的第二个参数是一个匿名方法,它与Function委托类型是兼容的。这个匿名方法只简单地返回每个元素的平方值,因此调用Apply方法得到的double[]包含了a中每个值的平方值。
MultiplyAllBy方法通过将参数数组中的每一个值乘以一个给定的factor来建立一个double[]并返回。为了产生这个结果,MultiplyAllBy方法调用了Apply方法,向它传递了一个能够将参数x与factor相乘的匿名方法。
如果一个本地变量或参数的作用域包括了匿名方法,则该变量或参数称为匿名方法的外部变量(outer variables)。在MultiplyAllBy方法中,a和factor就是传递给Apply方法的匿名方法的外部变量。通常,一个局部变量的生存期被限制在块内或与之相关联的语句内。然而,一个被捕获的外部变量的生存期要扩展到至少对匿名方法的委托引用符合垃圾收集条件时。

【方法组转换】
像前面章节中描述过的那样,一个匿名方法可以被隐式转换为一个兼容的委托类型。C# 2.0允许对一组方法进行相同的转换,即任何时候都可以省略一个委托的显式实例化。例如,下面的语句:
addButton.Click += new EventHandler(AddClick);
Apply(a, new Function(Math.Sin));
还可以写做:
addButton.Click += AddClick;
Apply(a, Math.Sin);
当使用短形式时,编译器可以自动地推断应该实例化哪一个委托类型,不过除此之外的效果都和长形式相同。

YOLOv11【第一章:零基础入门篇·第10节】YOLOv11项目实战:从零搭建检测系统! 🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。 阅读详情

相关推荐

Unreal5从入门到精通之如何解决在VR项目在头显中卡顿的问题

以前我们使用Unity开发VR,Unity提供了非常便利的插件和工具来做VR。但是由于Unity的渲染效果不如Unreal,现在我们改用Unreal来做VR了,所有的VR相关的配置和操作都要重新学习。今天就来总结一下,我在开发VR过程中碰到的所有问题。好了,以上就是我目前做VR时碰到的一些问题,希望对你有所帮助。

TxNet 2420

c#2.0新特性:(二)匿名方法Anonymous Methods

C#2.0中匿名方法允许将与一个委托关联的代码(通常指方法实体)“内嵌”到使用委托的地方,这样委托和方法实体都集中在一起,并且可以省略委托所代表的方法名称。另外,匿名方法能够共享对本地语句所包含函数成员的访问。 转载于:https://www.cnblogs.com/zhouxiaxue/archive/2007/01/31/635793.html...

weixin_30570101的博客 146

深度学习笔记——Transformer

本文详细介绍面试过程中可能遇到的Transformer知识点。

haopinglianlian的博客 1681

SpringSecurity中.antMatchers的anoymous()方法和permitAll()的区别

antMatchers的anoymous()方法和permitAll()方法的区别

LionHearthz的博客 6051

springsecurity中anonymous_Spring Security一个简单demo

​ Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于 Spring 的应用程序。​ Spring Security 是一个框架,侧重于为 Java 应用程序提供身份验证和授权。与所有 Spring 项目一样,Spring 安全性的真正强大之处,在于它很容易扩展以满足定制需求。​ 一个简单的spring secu...

weixin_39930557的博客 3799

C#进阶】C# 匿名方法

📺 hello大家好啊,我是哈桑c,本文为大家介绍 C# 中的匿名方法匿名方法顾名思义就是这类方法的特点是不需要特别去定义函数的名字的。一般我们需要一个函数,但又不想花时间去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。(简单演示)//输出:33 } }// 输出:25 } }匿名方法的优点:匿名方法可以用更少的代码实现相同的功能。减少代码的复杂性和冗余性,使代码更加简洁。

好学若饥,谦卑若愚。 6284

匿名方法

01.匿名方法——没有名字的方法方法也就是数学中的函数的概念),匿名方法只是在我们编写的源代码中没有指定名字而已,其实编译器会帮匿名方法生成一个名字,然而就是因为在源代码中没有名字,所以匿名方法只能在定义的时候才能调用,在其他地方不能被调用(匿名方法方法的定义和方法的实现内嵌在一起) 委托是方法的包装,匿名方法也是方法,只是匿名方法是没有名字的方法而已,所以委托也可以包装匿名方法 publ...

weixin_33950757的博客 1055

匿名方法Anonymous Methods)之Microsoft Corporation 解释

第三章 匿名方法原著:Microsoft Corporation原文:http://msdn.microsoft.com/vcsharp/team/language/default.aspx (SpecificationVer2.doc)翻译:lover_P出处:--------------------------------------------------------------------

doubleyou的专栏 1078

C#梳理【匿名方法Anonymous methods

C# 匿名方法 我们已经提到过,委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法匿名方法Anonymous methods) 提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。 在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。 编写匿名方法的语法 匿名方法是通

683

C# 编程中的匿名方法 Anonymous Methods :简化代码的艺术

匿名方法C#语言中一种特殊的委托,它允许开发者在不定义独立方法的情况下编写代码块。这种特性使得代码更加简洁,尤其适用于需要在委托中编写简单逻辑的场景。匿名方法C# 2.0中被引入,它为事件处理、线程启动等场景提供了极大的便利。定义方式:匿名方法使用delegate关键字定义,后面紧跟代码块。");这段代码中,delegate关键字后面直接跟一个代码块,而没有定义一个独立的方法。这种方式使得代码更加紧凑,避免了为简单逻辑编写单独方法的繁琐。用途:匿名方法的主要用途是简化代码,特别是在需要传递委托的地方。

caifox的博客 1195

了解c#2.0中的Anonymous Methods(匿名方法)

Anonymous MethodsC#2.0的新特性之一,它允许我们在代码中创建一个内置的没有方法名的方法,将代码与委托实例相关联,从而使委托的实例化工作更加直观和方便,提高了代码的可读性和可维护性。下面来看一个简单的匿名方法的使用: privateint[]_integers={1,2,3,4,5,6,7,8,9,10};int[]...

weixin_30488313的博客 133

Delegates, Events, and Anonymous Methods 委托、事件与匿名方法

译者注:委托、事件和匿名方法等在C#编程中有广泛运用,也有很多资料和书籍对它们做过大量介绍,但在我接触的人群中仍有很多人对它们还不甚了解,甚至惧怕。我希望这篇博文能够把这些东西说清讲透,也希望有此需要的园友在阅读之后能够获得对它们的深刻理解,并在今后的编程生涯中熟练地运用它们。还希望这篇博文成为介绍委托的经典的技术文章。 本文的主体内容译自《Introducing Visual C# 2010》

hy2011034628的专栏 943

.Net 2.0 新功能:匿名方法Anonymous Methods

匿名方法Anonymous Methods)1.       在2.0之前的c#版本中,声明委托的唯一方法是使用命名方法。this.Load+= new System.EventHandler(this.Form1_Load);    protected void Form1_Load(object sender, EventArgs e)    ...{        Messag

董浩的专栏 3008

重拾C#教程:高级部分-匿名方法Anonymous methods

原文地址:http://www.runoob.com/csharp/csharp-anonymous-methods.html我们已经提到过,委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法匿名方法Anonymous methods) 提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。在匿名方法中您不需要指定返回类型,它是从方法主...

纸上得来终觉浅,绝知此事要躬行 448

C# 高级特性(八):匿名方法Anonymous methods

匿名方法Anonymous methods) 提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。 在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。 class AnonymousMethods { // 委托中使用匿名方法 delegate void HandleMessage_Delegate(string message); public void Fun() {

tiankong1213的博客 561

匿名方法和Lambda表达式

一:匿名方法: 《1》:定义: 匿名方法Anonymous methods) 提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。 在匿名方法中您不需要指定返回类型,它是从方法主体内的return语句推断的。 《2》:匿名方法的使用: 匿名方法是通过使用delegate关键字创建委托实例来声明的。 无返回值无参的方法: class Program { ...

weixin_44870681的博客 614

创建匿名对象的方法

匿名方法与常规方法的使用

fool_Java的博客 444

创建接口匿名实现类的对象的四种方法

package InterfactTest; public class InterfaceTest { public static void main(String[] args) { // TODO Auto-generated method stub Computer com = new Computer(); com.transferData(new Print()); //创建了非匿名实现类的匿名对象 ...

weixin_42196338的博客 1004

Java 中的匿名类详解

是没有名字的内部类,它在定义的同时实例化。

2301_79858914的博客 4651

三相桥式不可控整流电路 Matlab/Simulink仿真

电力电子技术仿真模型

3相PFCcircuit.rar_3相PFC+PFC_forth61l_pfcmatlab_三相PFC仿真_对初学者很有用

三相PFCmatlab仿真,双环控制,对于初学者有很好的参考价值

上一篇: 泛型(Generics)
下一篇: 迭代器(Iterators)
doubleyou
博客等级 码龄22年 0粉丝 13原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值