• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#基础之匿名方法实例教程

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#开发实例大全基础卷,c#基础与实例教程,c#基础实例,c#窗体应用程序实例,c#串口通信实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文以实例形式讲解了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("Sunny Crystal"); 
   
  List<string> found = names.FindAll( new Predicate<string>(NameMatches)); 
 
  if (found != null) 
  { 
   foreach (string str in found) 
    Console.WriteLine(str); 
  } 
 } 
 
 static bool NameMatches(string name) 
 { 
  return name.StartsWith("sunny", StringComparison.OrdinalIgnoreCase); 
 }
}

</div>

这段代码在开始的时候初始化了一个字符串列表(string list),然后通过列表的FindAll方法来查找以“sunny”起始的字符串,最后将所查找到的所有结果输出。

我们需要着重介绍List<T>的FindAll方法。这个方法是一个参数为Predicate<T>类型、返回值为List<T>类型的函数。注意,Predicate<T>是一个泛型委托,它指代这样一些函数:这些函数仅有一个T类型的参数,并且返回值是布尔类型。通过reflector等工具,我们可以看到Predicate<T>的定义如下:

public delegate bool Predicate<T>(T obj); 
</div>

至此我们也多少能够猜到FindAll方法的具体实现。即针对List<T>中的每个元素,调用Predicate<T>所指代的函数,如果函数返回为true,则将其加入新建的列表中。遍历完所有的元素后,将新建的列表返回给调用者。如下:

public List<T> FindAll<T>(Predicate<T> match) 
{ 
 List<T> ret = new List<T>(); 
 foreach (T elem in items) 
 { 
  if (match(elem)) 
   ret.Add(elem); 
 } 
 return ret; 
} 
</div>

因此,针对上面的例子,要调用FindAll方法,我们必须先定义一个参数为string类型,返回值为布尔类型的函数,在这个函数中,对参数进行条件判断,如果符合条件(也就是以“sunny”作为起始字符串),那么就返回true,否则返回false。最后再将这个函数作为参数传递给FindAll。于是也就得到了最上面的代码。

在上面的例子中,为了调用FindAll方法,我们不得不新定义一个函数,其实这个函数除了FindAll方法要用外,别的地方都几乎很少使用到它,你还不得不给它起个名字。如果程序中有多处需要调用FindAll方法,或者类似的情况,那么整个程序也就会出现一大批“只有一个地方使用”的函数,使得代码难于阅读和维护。

由于存在这样的问题,C# 2.0引入了匿名方法。开发人员在实现方法的时候,只需要给出方法的参数列表(甚至也可以不给)以及方法具体实现,而不需要关心方法的返回值,更不必给方法起名字。最关键的是,只在需要的地方定义匿名方法,保证了代码的简洁。

匿名方法只在需要的地方定义,定义的时候,使用delegate关键字,后接参数列表,然后跟上用一对花括号包括起来的函数体即可。上面的代码可以重构成下面的形式:

class Program 
{ 
 static void Main(string[] args) 
 { 
  List<string> names = new List<string>(); 
  names.Add("Sunny Chen"); 
  names.Add("Kitty Wang"); 
  names.Add("Sunny Crystal"); 
 
  List<string> found = names.FindAll( 
   delegate(string name) 
   { 
    return name.StartsWith("sunny", StringComparison.OrdinalIgnoreCase); 
   }); 
 
  if (found != null) 
  { 
   foreach (string str in found) 
    Console.WriteLine(str); 
  } 
 } 
 
 //static bool NameMatches(string name) 
 //{ 
 // return name.StartsWith("sunny", 
 //  StringComparison.OrdinalIgnoreCase); 
 //} 
} 
</div>

此时,我们完全不需要NameMatches方法了,直接将匿名方法作为参数传递给FindAll方法。其实匿名方法本身还是有名字的,只是我们并不关心它究竟该取什么名字,因而.NET帮我们随便取了个名字罢了。

匿名方法在C#中应用十分广泛,因为委托作为函数参数是件非常平常的事情。在定义简单的事件处理过程时,我们同样可以使用匿名方法。比如:

ServiceHost host = new ServiceHost(typeof(FileTransferImpl)); 
host.Opened += delegate(object sender, EventArgs e) 
{ 
 Console.WriteLine("Service Opened."); 
};
</div>

匿名方法可以很方便地使用本地变量,这与单独定义的命名方法相比,能够简化编程。比如上文的例子中,假如Main函数里面定义了一个整型本地变量(局部变量)number,那么可以在delegate (string name)这一匿名方法定义中使用number变量。

上文提到,在定义匿名方法的时候,连参数列表都可以省略。因为编译器可以根据委托的签名来确定函数的签名,然后只要再给函数起个名字就可以了。下面的代码演示了这种使用方式:

delegate void IntDelegate(int x); 
 
// 带参数的定义方式 
IntDelegate d2 = delegate(int p) { Console.WriteLine(p); }; 
// 不带参数的定义方式(当然也没带返回值) 
IntDelegate d3 = delegate { Console.WriteLine("Hello."); }; 

</div>

在使用不带参数和返回值的匿名方法定义时,需要注意以下两点:

1.如果在你的匿名方法中需要对参数进行处理,那么你不能使用不定义参数列表的声明方式。也就是在定义匿名方法的时候,需要给出参数列表。
2.不带参数和返回值的匿名方法,可以被具有任何形式签名的委托所指代。

上述第一点显而易见,因为你没有定义参数列表,也就没有办法使用参数;要说明第二点,我们可以看下面的代码:

class Program 
{ 
 delegate void IntDelegate(int x); 
 delegate void StringDelegate(string y); 
 
 static void Output(IntDelegate id) 
 { 
 } 
 
 static void Output(StringDelegate sd) 
 { 
 } 
 
 static void Main(string[] args) 
 { 
  /* 
   * ERROR: The call is ambiguous between 
   *  Output(IntDelegate) 
   *    and 
   *  Output(StringDelegate) 
   */ 
  Output(delegate { }); 
 } 
} 

</div>

上面的代码没法编译通过,因为编译器不知道应该将delegate { }这一匿名方法还原为由IntDelegate指代的函数,还是还原为由StringDelegate指代的函数。此时只能显式给定参数列表,以便让编译器知道,我们究竟是想调用哪个Output函数。

希望本文所述对大家的C#程序设计有所帮助

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#反射之基础应用实例总结
  • C#基础之委托用法实例教程
  • C#基础之匿名方法实例教程
  • C#基础 延迟加载介绍与实例

相关文章

  • 2017-05-28C#实现动态生成静态页面的类详解
  • 2017-05-28C# SqlHelper应用开发学习
  • 2017-05-28使用C# Winform应用程序获取网页源文件的解决方法
  • 2017-05-28C# 泛型类(函数)的实例化小例子
  • 2017-05-28.Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用
  • 2017-05-28轻松学习C#的String类
  • 2017-05-28C#连接数据库和更新数据库的方法
  • 2017-05-28DevExpress之ChartControl实现时间轴实例
  • 2017-05-28DevExpress根据条件设置GridControl RepositoryItem是否可编辑
  • 2017-05-28C#实现用户自定义控件中嵌入自己的图标

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#.net实现在Winform中从internet下载文件的方法
    • C#采用Winform实现类似Android的Listener
    • 简单学习C#中的泛型方法使用
    • C#数组应用分析第1/2页
    • C#使用for循环移除HTML标记
    • C#编程获取IP地址的方法示例
    • C#图像亮度调整的方法
    • C#索引器介绍
    • C#动态执行批处理命令的方法
    • C#匹配中文字符串的4种正则表达式分享

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有