C#2.0新特性—匿名方法

C#编程语言权威指南读后感 本文是对《C#编程语言》一书的读后感,书中由C#的创造者之一Anders Hejlsberg及其团队编写,详细介绍了C#语言的发展、核心概念以及C# 2.0的新增特性。文章总结了书中主要内容,并分享了个人学习C#语言的心得体会。... 阅读详情
在C# 1.1里,声明和使用委托要求你有委托和一个在委托被触发时具有匹配签名的能够执行的方法,以及一个将命名方法与委托关联的分配语句。作为C# 2.0的新特性,匿名方法基本上能够提供与先前命名方法相同的功能,但是它已经不再需要一个在关联到委托之前就明确创建的方法了。

    你可以把匿名方法想象为一个实现与委托进行关联这项功能的便捷途径。如果同时看一下匿名方法实现和命名方法实现所取得IL结果,你会发现这两者之间的差别非常小。当编译器碰到匿名方法的时候,它会在类里面创建一个命名方法,并将它与委托进行关联。所以匿名方法在运行期间与命名方法的性能非常类似——性能的增加体现在开发人员的生产效率上,而不是运行期间的执行上。

如何使用匿名方法

    多用代码少用说教来解释和理解匿名方法会容易一些。下面的例子应该能够说明你自己可以如何利用匿名方法的优势:

例1——基础知识

    使用匿名方法很简单。你只需要把匿名方法放在你通常放命名方法的关联语句里。在下面这个例子里,我把匿名方法和示例1的委托关联在一起:

示例列表1

    #region Simple example - Example1
    privatedelegatevoidExample1();

    privatevoid btnExample1_Click(object sender, EventArgs e)
    {
        //Declare an instance of the Example1 delegate.
        // You can see where I'm using the anonymous
        // method in place of a named method - it follows
        // the delegate() keyword.
        Example1 example =
            newExample1(
                delegate()
                {
                    MessageBox.Show("Example1");
                });

        example();
    }
    #endregion

例2——变量范围

    任何在匿名方法里声明的变量的范围都不会超出匿名方法的代码块。但是,匿名方法确实具有访问它们代码块之外的变量的能力,只要这些变量在匿名方法所使用的范围里。这些变量被微软称为外部变量。下面示例2显示了匿名方法如何引用外部变量:

示例列表2

   #region Variable scope example - Example2
   privatedelegatevoidExample2();

   privatevoid btnExample2_Click(object sender, EventArgs e)
   {
       //Setup our parameters.
       string firstName = "Zach";
       string lastName = "Smith";

       //Create an instance of the Example2 delegate with an
       // anonymous method.
       Example2 example =
           newExample2(
               delegate() {
                   MessageBox.Show(firstName + " " + lastName);
              });

       //Execute the delegate.
       example();
   }
   #endregion

要注意的是,根据MSDN的文档,匿名方法里的ref和out参数无法被访问到。

例3——参数的传递

    你可以将参数传递给匿名方法,方式就和你处理引用命名方法参数的委托一样。下面的示例3说明这种类型的功能:

示例列表3

   #region Parameter example - Example3
   privatedelegatevoidExample3(string firstName, string lastName);

   privatevoid btnExample3_Click(object sender, EventArgs e)
   {
       //Setup our parameters.
       string parameter1 = "Zach";
       string parameter2 = "Smith";

       //Create an instance of the Example3 delegate with an
       // anonymous method.
       Example3 example =
           newExample3(
               delegate(string firstName, string lastName)
               {
                   MessageBox.Show("Example3: " + firstName + " " + lastName);
               });

       //Execute the delegate.
       example(parameter1, parameter2);
   }
   #endregion

例4——多个方法的关联

    就和命名方法一样,将多个匿名方法与同一个委托进行关联是可能的。这在很多情况下会非常有用——首先想到的是把一个简单的处理程序添加给按钮的点击事件。下面的代码(示例4)显示了一个委托,它同时带有与之相关联一个匿名方法和一个命名方法:

示例列表4

   #region Multiple method association (stacking) - Example4
   privatedelegatevoidExample4(string firstName, string lastName);

   privatevoid btnExample4_Click(object sender, EventArgs e)
   {
       //Setup our parameters.
       string parameter1 = "Zach";
       string parameter2 = "Smith";

       //Create an instance of the Example4 delegate with an
       // anonymous method.
       Example4 example =
           newExample4(
               delegate(string firstName, string lastName)
               {
                   MessageBox.Show("Example4: " + firstName + " " + lastName);
               });

       //Add another method to the delegate - this time
       // a named method.
       example += newExample4(Example4NamedMethod);

       //Execute the delegate.
       example(parameter1, parameter2);
   }

   privatevoid Example4NamedMethod(string firstName, string lastName)
   {
       MessageBox.Show("Example4Method: " + firstName + " " + lastName);
   }
   #endregion

例5——将匿名方法作为参数传递

    就和命名方法一样,将匿名方法作为参数传递给函数是可能的。这并不是一个我认为会通常使用的特性,但是我敢肯定未来会有这种需要。下面的代码(例5)说明了这种类型的功能,它将一个命名方法作为参数传递给了函数:

示例列表5

   #region Passing anonymous methods - Example5
   privatedelegatevoidExample5(string firstName, string lastName);

   privatevoid btnExample5_Click(object sender, EventArgs e)
   {
       //Execute Passit and pass the anonymous method.
       Passit((Example5)delegate(string firstName, string lastName)
               {
                   MessageBox.Show("Example5: " + firstName + " " + lastName);
               });

       //Execute Passit with the named method.
       Passit(Example5NamedMethod);
   }

   privatevoid Example5NamedMethod(string firstName, string lastName)
   {
       MessageBox.Show("Example5Method: " + firstName + " " + lastName);
   }

   privatevoid Passit(Example5 example)
   {
       example("Zach", "Smith");
   }
   #endregion

例6—-访问类成员

    这是对上面例2的变量范围的扩展。但是,这个例子(例6)说明了匿名参数还能够在它们的代码块之外执行命名方法:

示例列表6

    #region Accessing class members - Example6
    privatedelegatevoidExample6();

    privateint _customerId;
    privatestring _customerCode;

    publicint CustomerID
    {
        get { return _customerId; }
        set { _customerId = value; }
    }

    publicstring CustomerCode
    {
        get { return _customerCode; }
        set { _customerCode = value; }
    }

    privatevoid btnExample6_Click(object sender, EventArgs e)
    {
        //Populate out properties.
        this.CustomerID = 90;
        this.CustomerCode = "1337HK";

        //Setup the delegate/anonymous method.
        Example6 example =
            newExample6(
                delegate
                {
                    this.ShowCustomer(this.CustomerID, this.CustomerCode);
                });

        //Execute the delegate.
        example();

        //Change the properties.
        this.CustomerID = 54;
        this.CustomerCode = "L4M3";

        //Execute the delegate again.
        // Notice that the new values are reflected.
        example();
    }

    privatevoid ShowCustomer(int customerId, string customerCode)
    {
        MessageBox.Show(
            String.Format("CustomerID: Customer Code: ",
                            customerId, customerCode));
    }
    #endregion

    要注意的是,我两次调用了与匿名方法相关联的委托。你可能会发现一个很有趣的事情:在这些调用中,方法会输出两组不同的值。这是因为用在匿名方法里的外部变量在创建匿名方法的时候被引用。这意味着对这些变量的任何更改都会在匿名函数访问变量的时候被反映出来。

    你可能还注意到在这个实例里委托关键字后面没有括号。当匿名方法不需要带参数的时候,后面的括号是可选的。

Jev模型入门:从API接入到本地部署的完整实践指南 大模型的应用方式正从单一聊天窗口转向复杂的自动化工作流,而推理模型因具备指令跟随与结构化输出能力,成为构建Agent和数据处理管线的关键组件。Jev作为面向通用场景的推理模型,不仅提供了OpenAI兼容的API接口,还支持本地量化部署,兼顾隐私、可控性与长期成本。本文从模型定位出发,明确Jev与基座模型的差异,随后介绍密钥管理、API调用、参数调优,并深入演示基于Ollama与llama.cpp的本地部署流程,包括GGUF模型文件与chat template的匹配要点。针对实践中的常见问题,如密钥泄露、ma 阅读详情

相关推荐

手把手教你用MATLAB/Simulink模拟微电网潮流方向(附代码下载)

本文提供了一份详细的MATLAB/Simulink微电网潮流仿真实战指南。通过手把手教学,指导读者从零搭建包含光伏、储能和负荷的微电网模型,并模拟并网、孤岛等多种运行场景下的潮流方向变化。文章核心在于利用Simulink实现微电网的动态潮流分析与可视化,帮助工程师深入理解分布式能源系统中的功率平衡与控制策略。

weixin_28314575的博客 106

深入解析 C# 匿名类型:用法、特性与案例

在 C# 编程中,匿名类型是一种由编译器生成的类,它提供了一种便捷的方式来创建包含一组只读属性的对象,而无需显式定义一个类。匿名类型通常用于临时存储和传递数据,特别是在 LINQ 查询中,它们可以快速地将查询结果封装成对象,而无需事先定义一个类来表示这些结果。定义方式:匿名类型通过new关键字和对象初始化器语法来定义。例如,这里创建了一个包含Name和Age属性的匿名类型对象。编译器会自动生成一个类,该类具有与初始化器中指定的属性相对应的只读属性。用途临时数据封装。

caifox的博客 1309

FastAPI + Layui:打造企业级敏捷开发后台管理系统

本文详细介绍了如何使用FastAPI和Layui构建高效的企业级后台管理系统。FastAPI提供高性能的异步API支持,而Layui则简化了前端开发流程,两者结合可实现快速开发和部署。文章涵盖了从环境搭建、核心组件开发到性能优化的全流程,特别适合需要敏捷开发的企业项目。

weixin_29045585的博客 555

.Net2.0 New Feature(一) 匿名方法

最近事情不多,闲来无事突然发现与其盲目追寻新技术,不如温故,而且本人从1.1到2.0的过程太过仓促,实际工作中还是在用1.1的方法写2.0的代码,虽然无错,只是失去了它本身的意义了。于是就又翻起书重新整理这部分的知识。本着做笔记的思路写这些东西,对自己而非别人,如果有兴趣或者有想法希望不吝赐教。 闲话休叙,第一回先写匿名方法。相信大多数人和我一样我了解这个概念是...

169

OV5645摄像头原理图设计,已量产

在嵌入式视觉项目里,摄像头小板真正决定量产稳定性的,往往不是把传感器接出来这件事本身,而是电源域有没有拆清、参考时钟够不够干净、主板调试时有没有留出可落地的接口。ATK-MC5645 这张原理图的价值,就在于它没有把 OV5645 裸接到一排连接器上,而是把 AFVDD_2V8、DOVDD_1V8、DVDD_1V5、24MHz 时钟和 MIPI/控制信号都收敛在一块独立模组上。

不脱发的程序猿 329

图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码)

本文介绍了一种基于多尺度Retinex(MSR)和CLAHE的低照度图像增强算法。算法首先对图像进行多尺度Retinex处理,通过不同尺度的高斯核去除光照影响;然后采用CLAHE算法进行对比度增强。Matlab实现展示了算法流程,包含灰度转换、多尺度Retinex增强和CLAHE处理。实验结果显示,该方法能有效提升低照度图像的可见性,增强细节表现。最后提出了改进建议,包括引入深度学习方法和优化参数选择。

尘世冰封的专栏 952

C#2.0匿名函数

C# 2.0中提供了通过delegate实现匿名函数功能,能有效地减少用户记代码工作,例如 以下为引用: ... button1.Click += new EventHandler(button1_Click); ... void button1_Click(Object sender, EventArgs e) { // Do something, the button was cli...

aome1470的博客 207

微信小程序|基于小程序+云开发制作一个菜谱小程序

今天吃什么?这是一个让强迫症左右为难的问题,跟随此文基于小程序+云开发制作一个菜谱小程序,根据现有食材一键生成菜谱,省心又省力。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

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

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

tiankong1213的博客 564

Open3D——平面点云凸多边形轮廓提取【2025最新版】

平面点云凸多边形轮廓提起,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 6753

Openclaw接入大模型API,操作本地windows文件

本文介绍了在WSL2环境下配置OpenClaw使用阿里百炼API的方法。主要内容包括:1)确认WSL2安装完成;2)配置阿里百炼API(需注意Qwen3-Max-Thinking为收费模型);3)提供正确的JSON配置格式示例,强调apiKey必须填写真实值;4)说明配置错误需修改Linux配置文件;5)建议通过询问模型信息验证连接成功。后续将介绍如何切换免费API及本地文件访问功能。

qq_27246521的博客 989

C#教程:关于匿名类型的特性

首先让我们看一个例子, 假设我们并没有Person类, 并且我们关心的属性只有Name和Age. 下面的代码演示了我们如何在没有声明类型的情况下来构建一个对象的: 1: var tom = new { Name = Tom, Age = 4 }; 2: var holly = new { Name = Holly, Age = 31 }; 3: var jon = new { Na...

weixin_30840573的博客 243

STM32入门教程:水位传感器应用

这是一个简单的STM32水位检测系统的入门教程。希望通过学习本教程,您能对STM32微控制器的基本应用有更深入的了解,并能成功构建一个水位检测系统。如果您需要更详细的代码实例和教程,请参考相关的STM32开发手册和应用笔记。STM32是一款功能丰富且广泛应用于嵌入式系统的微控制器系列。在本教程中,我们将介绍如何使用STM32微控制器和水位传感器构建一个水位检测系统。

wx_linying1029的博客 533

第1节 C#2.0新特性之三:匿名方法

匿名类型    匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。这些属性的类型由编译器推断。下面的示例演示一个用两个分别名为 Amount 和 Message 的属性初始化的匿名类型。    var v = new { Amount = 108,

powersea2的专栏 411

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

十二随风 433

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C#2.0的新特性

**************************************************************        C#2.0的新特性 前一段时间写Resume,写自己熟悉.Net 2.0。然后想到如果别人问C#2.0有些什么新特性,我应该怎

clszd0717的专栏 314

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C#各语言版本特性介绍

C# 2.0泛型(Generics)泛型是CLR 2.0中引入的最重要的新特性,使得可以在类、方法中对使用的类型进行参数化。例如,这里定义了一个泛型类:class MyCollection<T> { T variable1; private void Add(T param){ } } 使用的时候:MyCollection<string> list2 = new MyCol...

MIss-Y的博客 2118

C#2.0 新特性概述

前一段时间写Resume,写自己熟悉.Net 2.0。然后想到如果别人问C#2.0有些什么新特性,我应该怎么回答呢?发觉原来除了泛型(Generic)外自己也说不出什么。于是翻书查资料重新整理了思路。重新审视C#2.0的新特性,当作学习3.0的起步吧。 一、泛型(Generic) 概述: 引入泛型绝对是C#2.0的最大的新特性。通过“参数化类型”实现一份代码操作多种数据类...

asq00220的博客 231

C#2.0和3.0主要的新特性

 C# 2.0和3.0主要新特性C# 2.0新特性 C# 2.0引入了很多语言扩展,最重要的就是泛型(Generics)、匿名方法(Anonymous Methods)、迭代器(Iterators)和不完全类型(Partial Types)。 一、泛型   泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Fra

01世界 565

C# (VB.Net) 2.0至4.0的新特性

基于上一篇.Net Framework里面介绍的新特性其实是语言层面的特性,所以我单独拿出来放到这篇博客里面。

走过的路和守望的未来 870

C#2.0新特性:泛型(Generics)、匿名方法(Anonymous Methods)、迭代器(Iterators)和不完全类型(Partial Types)

1:泛型 不多说了,个人理解泛型就是泛参数化,即用T表示所有的类型。 public class WSView{ public virtual DataTable searchView(T sp) {。。。。。。} } [WebMethod]    public ViewEntity[] ViewSummary(SumParameters sp)    {        WSView v

codestiny的android小屋 1020

C#2.0 新特性

C# 2.0新特性,包括泛型、迭代器、可空类型、匿名方法、委托的协变与逆变、静态类等。

高级项目经理、专注于技术架构、分享项目管理及职场心得 614

C# 2.0新特性与C# 3.5新特性[转]

C# 2.0新特性与C# 3.5新特性 一、C# 2.0 新特性: 1、泛型List obj_list=new List();obj_list.Add(new MyObject()); 2、部分类(partial)namespace xxx{public partial class Class1{private string _s1;public string S1{get { return

http://itech.cnblogs.com 606

C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码

C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码发布日期: 11/10/2004 | 更新日期: 11/10/2004Juval Lowy本文基于 Microsoft Visual Studio 2005 的预发布版本,它以前的代码名称为“Whidbey”。此处所包含的任何信息都可能会改变。本文讨论:

网悠在线 1199

关于C#3.0新特性以及扩展方法!

C#2.0新特性  1、 泛型:在我看来,泛型就是通过将数据类型参数化从而实现了代码的更为灵活的复用,泛型的出现使得C#能够使用同一段代码来操作多种数据类型。泛型无疑是C#2.0最重大的改进,它的出现赋予了C#代码更强的类型安全,更好的复用,更高的效率和更清晰的约束。  2、 匿名方法:匿名方法允许我们将代码直接与委托实例相关联,使委托实例化工作更加直观和方便。在我看来,这只是C#又多了一

showrock的专栏 759
上一篇: C#2.0新特性—迭代器
下一篇: C# 2.0会给我们带来什么
junmail
博客等级 码龄22年 159粉丝 452原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值