C#中的匿名方法实例解析

本文较为详细的讲述了C#中的匿名方法,并附上实例加以说明。现将其分享给大家供大家参考之用。具体分析如下:

首先,C#中的匿名方法是在C#2.0引入的,它终结了C#2.0之前版本声明委托的唯一方法是使用命名方法的时代。虽然在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。但是,匿名方法的信息同样也适用于 Lambda 表达式,可以说 Lambda 表达式就是匿名方法演变过来的。

我们可以使用匿名方法来忽略参数列表。 这意味着匿名方法可转换为具有各种签名的委托,而这对于 Lambda 表达式来说是不可能的。 学好匿名方法,才能更加深刻地理解好 Lambda 表达式。

在说匿名方法的使用之前,先来说说匿名方法的其他叫法。匿名方法也有人叫匿名委托、匿名函数,虽然现在普遍通用,但是还是有点区别的。msdn官网上说:要将代码块传递为委托参数,创建匿名方法则是唯一的方法。这里的匿名方法就是官方的说法,而因为匿名方法就是为了将代码块传递为委托参数,因此也有人叫匿名委托,包括笔者也喜欢这种称呼,我觉得这样叫通俗易懂。至于匿名函数,因为C#中“方法”(Method)的概念有些语言叫“函数”(Function),因此匿名方法也被人叫做匿名函数。然而在msdn文档介绍中匿名函数包括了Lambda 表达式和匿名方法,可以说匿名函数是更高的一级,所以说最官方的叫法还是匿名方法,当然其他的叫法流传也甚广,听得懂就行了,没必要纠结。

接下来说说匿名方法的写法规则,先上例子:

delegate(int i) { return i > 0; }

它遵循这样的格式书写:

delegate(形参表){方法体代码}

可以类比js中匿名函数的写法来记忆。

那么匿名方法运用在哪里呢?怎么使用呢?当你需要一个临时方法,该方法使用次数极少或者你需要的这个方法的代码很简短,那么你就可以使用匿名方法。给个简单的例子,如果需要在一个整型集合中筛选出符合条件的新集合,如下

List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };
//假设需要从list集合中获取大于3的所有元素以新集合返回
var newlist = newlist.FindAll(GetNewList);

GetNewList()为另外定义的和委托Predicate<T>具有同签名的方法(Predicate<T>是系统内置委托)

GetNewList()定义如下:

bool GetNewList(int i)
{
  return i > 3;
}

以上是没有使用匿名方法时的写法,如果使用了匿名方法,你就会发现一切变得如此简便,

List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };
var newlist = list.FindAll(delegate(int i) { return i > 3; });

通过对比,可以发现使用匿名方法能够提供与先前命名方法相同的功能,但是它已经不再需要一个在关联到委托之前就明确创建的方法了,因此也减少了实例化委托所需的编码系统开销,这就是它的最大好处。

相信本文所述对大家的C#程序设计有一定的借鉴价值。

(0)

相关推荐

  • C#实现在匿名方法中捕获外部变量的方法

    先来一段代码引入主题.如果你可以直接说出代码的输出结果,说明本文不适合你.(代码引自<深入理解C#>第三版) class Program { private delegate void TestDelegate(); static void Main(string[] args) { TestDelegate[] delegates = new TestDelegate[2]; int outside = 0; for(int i = 0; i < 2; i++) { int insid

  • C#用匿名方法定义委托的实现方法

    本文实例讲述了C#用匿名方法定义委托的实现方法.分享给大家供大家参考.具体实现方法如下: //用匿名方法定义委托 class Program { delegate string MyDelagate(string val); static void Main(string[] args) { string str1 = " 匿名方法外部 "; //中括号部分定义来了一个方法,没有名称,编译器会定指定一个名称 MyDelagate my = delegate(string param)

  • C#基础之匿名方法实例教程

    本文以实例形式讲解了C#的匿名方法的用法,分享给大家供大家参考之用.具体如下: 匿名方法是C# 2.0的语言新特性.首先看个最简单的例子: class Program { static void Main(string[] args) { List<string> names = new List<string>(); names.Add("Sunny Chen"); names.Add("Kitty Wang"); names.Add(&q

  • C# 匿名方法基础回顾

    目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ≥ C# 3.0 的版本中,我们会用 Lambda 表达式进行取代匿名方法,并且用 Lambda 表达式作为编写内联代码的首选方式,因为它更简洁. 匿名方法是,顾名思义,匿名方法就是没有名称的方法.匿名方法最明显的好处就是:可以降低额外另写一个方法的工作量:另外一个好处就是可以直接访问调用者的变量,从而降低传参的复杂度. 匿名方

  • 初步认识C#中的Lambda表达式和匿名方法

    写在前面 元旦三天在家闲着无事,就看了看Linq的相关内容,也准备系统的学习一下,作为学习Linq的前奏,还是先得说说Lambda与匿名方法的知识点.也算是对知识点的查漏补缺吧,也许你会说这没啥大不了的,项目中都在用,但是有些知识,你回头在查看的时候,总会有那么点不一样的收获,这点我是感同身受的,我看书有个习惯,一本书,我能看个三四遍,每次总会有收获.当然,你可以说,当时肯定没认真看,不是那样子的,我认为最直接的原因在于,当时你看是看,没有在真正的项目中遇到过,所以你心里对它的理解并不深,如果在

  • c# 匿名方法的小例子

    复制代码 代码如下: // 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.delegate void Del(int x); // Instantiate

  • C#匿名方法与Delegate类型转换错误分析

    本文实例分析了C#匿名方法与Delegate类型转换错误.分享给大家供大家参考.具体分析如下: 问题描述 C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法: 复制代码 代码如下: public object Invoke(Delegate method); public IAsyncRe

  • C#特性之匿名方法和Lambda表达式

    在我们程序中,经常有这样一些需求: 1.       需要一个临时方法,这个方法只会使用一次,或者使用的很少. 2.       这个方法的方法体很短,以至于比方法声明都短,写起来实在没劲(我将其称之为"一句话方法"). 没办法,这样的方法写起来真是吃力不讨好,比如一些按钮事件处理中,有些按钮点击就是弹出一个对话框,或者调用一下别的什么方法.比如下面的代码: 复制代码 代码如下: this.btnRefresh.Click += new System.EventHandler(this

  • C#警惕匿名方法造成的变量共享实例分析

    本文实例讲述了C#警惕匿名方法造成的变量共享.分享给大家供大家参考,具体如下: 匿名方法 匿名方法是.NET 2.0中引入的高级特性,"匿名"二字说明它可以把实现内联地写在一个方法中,从而形成一个委托对象,而不用有明确地方法名,例如: static void Test() { Action<string> action = delegate(string value) { Console.WriteLine(value); }; action("Hello Wor

  • C#中的匿名方法实例解析

    本文较为详细的讲述了C#中的匿名方法,并附上实例加以说明.现将其分享给大家供大家参考之用.具体分析如下: 首先,C#中的匿名方法是在C#2.0引入的,它终结了C#2.0之前版本声明委托的唯一方法是使用命名方法的时代.虽然在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式.但是,匿名方法的信息同样也适用于 Lambda 表达式,可以说 Lambda 表达式就是匿名方法演变过来的. 我们可以使用匿名方法来忽略参数列表. 这意味着匿名方法可转换为具有各种签名

  • spring中FactoryBean中的getObject()方法实例解析

    本文研究的主要是spring中FactoryBean中的getObject()方法的相关内容,具体如下. FactoryBean接口定义了以下3个接口方法: Object getObject():返回有FactoryBean创建的Bean实例,如果isSingleton()返回true,则该实例会放到Spring容器的单实例缓存池中. boolean isSingleton():确定由FactoryBean创建Bean的作用域是singleton还是prototype. Class getObj

  • JFrame中添加和设置JPanel的方法实例解析

    Swing 程序用JFrame 对象实现了它们的窗口.JFrame 类是AWT Frame 类的一个子类.它还加入了一些Swing 所独有的特性.与 Frame 的使用十分相似.唯一的区别在于,你不能将组件加入到JFrame中.你可以或者将组件加入到JFrame 的content pane(内容面板) 中,或者提供一个新的content pane(内容面板). 面板与顶层容器的不同点:面板不能独立存在,必须被添加到其他容器内部(面板可以嵌套). JFrame 有一个 Content Pane,窗

  • xtemplate node.js 的使用方法实例解析

    工程下安装XTemplate并使用它的方法实例说明: 1.安装xtpl 复制代码 代码如下: npm install xtpl xtemplate --save 2.在views目录添加test.xtpl文件,其内容为 this is {{title}}! 4.集成到Express中,只需要在app.js中,设置模板引擎即可 var print = require('./routes/print'); //此行代码放入app.js的require 声明代码段下边 app.set('view en

  • Android 媒体开发之MediaPlayer状态机接口方法实例解析

    一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : 从 Idle 到 End 状态就是 MediaPlayer 整个生命周期; -- 生命周期开始 : 进入 Idle (闲置) 状态; -- 生命周期结束 : 进入 End (结束) 状态; Idle 和 End 状态转换 : -- 进入 Idle 状态 : MediaPlayer 刚被创建 new

  • Java多线程回调方法实例解析

    所谓回调,就是客户程序C调用服务程序S中的某个方法A,然后S又在某个时候反过来调用C中的某个方法B,对于C来说,这个B便叫做回调方法. 下面看一个实际例子来理解: 本示例设置一个提问者,一个回答者,而回答者需要回答提问者一个很深奥的问题时,这时需要很多时间去查找,提问者又开始做其他的事情, 等回答者找到答案后,再把答案告诉提问者. 一.提问者的类 涉及到长时间的思考,要sleep,要继承Thread package com.xykj.thread; public class XiaoZhang

  • Collections.shuffle()方法实例解析

    本文研究的主要是Collections.shuffle()方法的相关内容,下面看看具体内容. Java.util.Collections类下有一个静态的shuffle()方法,如下: 1)static void shuffle(List<?> list) 使用默认随机源对列表进行置换,所有置换发生的可能性都是大致相等的. 2)static void shuffle(List<?> list, Random rand) 使用指定的随机源对指定列表进行置换,所有置换发生的可能性都是大致

  • jdbcTemplate使用方法实例解析

    这篇文章主要介绍了jdbcTemplate使用方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式. JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做需要做的事情(即可变部分),并且帮我们做哪些固定部分,如连接的创建及关闭. 在appli

  • Python3打包exe代码2种方法实例解析

    这篇文章主要介绍了Python3打包exe代码2种方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 cx_Freeze(不推荐) 以前只用 cx_Freeze 支持将 python3 打包成 exe ,示例如下: 在你要打包的 python 文件下新建这个 setup.py 文件: #!/usr/bin/env python # -*- coding: utf-8 -*- from cx_Freeze import setup, Ex

  • JavaScript中this函数使用实例解析

    这篇文章主要介绍了JavaScript中this函数使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 普通函数 普通函数中的this,普通函数中的this表示调用此函数时的对象,如下例: var x=11; var obj={ x:22, say:function(){ console.log(this.x) } } obj.say(); //console.log输出的是22 //调用say函数的是对象obj,所以this指代对象o

随机推荐