zoukankan      html  css  js  c++  java
  • .NET(C#)中[匿名方法]的用处多(妙用)

    在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法.通过使用匿名方法,由于您不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。有时匿名方法可以完成命名方法费好大的劲才能完成的功能。不过请注意匿名委托不能显式地有返回值,但是如果委托的签名有返回值的话,只要按照委托实际的签名在代码块中返回值就可以了。

        匿名方法的生命周期由于是局部范围内的这个缺点同时又是它的一个优点,可以方便地访问局部变量,而如果使用命名方法有时则会显得很麻烦。   

        现在举例如下说明:
        问题:要求返回在Windows Form窗体中所有不同类型控件的类型名称的集合
       思路:在Form类中有一个Controls集合,只要遍历Controls集合,得到把每个控件(Control),通过Control.GetType().ToString()就可以得到类型名称,可以把这个类型名称放在一个List<string>里面,每次加新控件前,查找一下这个控件类型名称集合里面是否已经存在,如果存在就不加入,如果不存在就加入.
      解决:
         声明List<string> listControlType = new List<string>();//存储控件类型名称的List<string>变量
         foreach(Control control in Controls)
         {
               string tmp = listControlType.Find(
                                delegate(string s){
                                        if(s == control.GetType().ToString())
                                                return true;
                                        else
                                                return false;
                                }
                        );

               if(tmp == default(string))
               {
                  listControlType.Add(c.GetType().ToString());
               }
         }

        试想如果用命名方法来实现的话会很麻烦的.因为涉及到局部变量

        .注意上面的List<T>.Find()方法中的委托原型是这样的:
        public delegate bool Predicate<T>(T obj)
        在我上面的匿名委托中并没有显式地声明返回类型(编译器是不允许的,无法通过编译),但是要要保证匿名块中每条路径都返回 bool.

  • 相关阅读:
    @Controller、@RestController、@RequestMapping、@ResponseBody、@RequestBody、@RequestParam用法详解
    Vue-Cli脚手架文件main.js、App.vue、index.html、index.js详解
    超详细的SpringBoot+Mybatis+Vue整合笔记
    初遇PHP(一)
    IDEA2018.2.6激活(可用)
    版本控制器之SVN(二)
    版本控制器之SVN(一)
    C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】
    C语言Windows程序开发—CreateWindow函数介绍【第03天】
    C语言Windows程序开发—TextOut函数介绍【第02天】
  • 原文地址:https://www.cnblogs.com/mcjtcnblog/p/1359536.html
Copyright © 2011-2022 走看看