C# 匿名方法基础回顾

所属分类: 软件编程 / C#教程 阅读数: 98
收藏 0 赞 0 分享

目录

  1. 简介
  2. 匿名方法的参数使用范围
  3. 委托示例

简介

在 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#开发word批量转pdf源码分享

已经安装有Office环境,借助一些简单的代码即可实现批量Word转PDF,看下面的实例源码吧
收藏 0 赞 0 分享

c# xml API操作的小例子

这篇文章主要介绍了c# xml API操作的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

c#唯一值渲染实例代码

这篇文章主要介绍了c#唯一值渲染实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

淘宝IP地址库采集器c#代码

这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C#在后台运行操作(BackgroundWorker用法)示例分享

BackgroundWorker类允许在单独的专用线程上运行操作。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题,下面看示例
收藏 0 赞 0 分享

c#文本加密程序代码示例

这是一个加密软件,但只限于文本加密,加了窗口控件的滑动效果,详细看下面的代码
收藏 0 赞 0 分享

c#生成站点地图(SiteMapPath)文件示例程序

这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
收藏 0 赞 0 分享

C# 键盘Enter键取代Tab键实现代码

这篇文章主要介绍了C# 键盘Enter键取代Tab键实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C# WinForm导出Excel方法介绍

在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式
收藏 0 赞 0 分享

C#串口通信程序实例详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,创建C#串口通信程序的具体实现是如何的呢?让我们开始吧
收藏 0 赞 0 分享
查看更多