zoukankan      html  css  js  c++  java
  • 第十四回 基础才是重中之重~委托实例的几种定义方式(规规矩矩method,逻辑简单delegate,层次清晰lambda)

    委托,一个不错的东西,.net中的委托用着挺爽,它的重要性以至于微软把它单拿出来,定义了几个现成的委托,如,Func和Action,既然人家把最特殊的委托签名拿 出来了,所以咱们就不

    自己去定义了,就用Func和Action委托去讲一个如何定义他们的实例吧,呵呵。

    第一 规规矩矩定义方法method

    1        /// <summary>
    2         /// 与Func<string>相同的方法签名
    3         /// </summary>
    4         /// <returns></returns>
    5         static string StandardFunc() { return "标准点好"; }
    6         Func<string> Standard = new Func<string>(StandardFunc);//标准的委托实例

    第二 逻辑简单匿名方法delegate

    在对于方法逻辑简单的时候,我们没有必须再去定义一个额外的方法,而直接使用匿名方法即可

    1   Func<string, bool> FuncWhat2 = delegate(string s) { return s == "hello"; };//delegate定义一个匿名方法,不用重新再定义一个方法了
    1  Func<bool> FuncWhat3 = delegate() { return true; }; 

    第三 层次清晰lambda

    同样的逻辑简单,使用lambda表达式则会使代码层次感更清晰,本人超级推荐,呵呵

    1 Func<string, string> FuncWhat4 = (string msg) => hello(msg);

    事实上,微软自己的类库,也经常使用这种lambda方式,在每个新的技术出现时,小微自己都先去尝试,呵呵。

    复制代码
     1         //
     2         // 摘要:
     3         //     通过使用实现验证资源访问功能的函数,初始化 System.ComponentModel.DataAnnotations.ValidationAttribute
     4         //     类的新实例。
     5         //
     6         // 参数:
     7         //   errorMessageAccessor:
     8         //     实现验证资源访问的函数。
     9         //
    10         // 异常:
    11         //   System:ArgumentNullException:
    12         //     errorMessageAccessor 为 null。
    13         protected ValidationAttribute(Func<string> errorMessageAccessor);
    复制代码

    上面我只是一个简单的举例,在实际开发时,还要因情况而定,下面是在实现项目中的一个应用,当用户登陆时,去触发一个LogOn事件,然后,所以订阅了它的方法都自动去处理自己的

    逻辑,看代码:

    复制代码
     1     /// <summary>
     2     /// 登陆事件
     3     /// </summary>
     4     public class LogOnEvent
     5     {
     6 
     7         /// <summary>
     8         /// 登陆后的事件
     9         /// </summary>
    10         public static event Action LogOnAfter;
    11 
    12         /// <summary>
    13         /// 触发RegisterAfter事件(在本程序集中去触发)
    14         /// </summary>
    15         internal static void OnLogOnAfter()
    16         {
    17             if (LogOnAfter != null)
    18             {
    19                 LogOnAfter();
    20             }
    21         }
    22 
    23     }
    复制代码

    而如果你希望在系统登陆时,去做一些事情,你可以先去订阅它就可以了,类型这种:

    复制代码
     1               //lambda方式
     2                 LogOnEvent.LogOnAfter += () =>
     3                 {
     4                     //登陆后要处理的逻辑 
     5                 };
     6                 //匿名方法方式
     7                 LogOnEvent.LogOnAfter += delegate()
     8                 {
     9                     //登陆后要处理的逻辑 
    10                 };
    11                 //普通方式
    12                 LogOnEvent.LogOnAfter += LogDiary;
    复制代码
  • 相关阅读:
    python模块win32com中的early-bind与lazy-bind(以Autocad为例)
    Beautiful code and beautiful life
    PyPI 使用的国内源
    JavaScript在SublimeText中的配置
    Python中的模块包
    FTP 服务器在WIN10上的搭建及服务端下载文件实例
    Oracle ASM磁盘组兼容性
    oracle ADVM
    053-28
    053-27
  • 原文地址:https://www.cnblogs.com/ywsoftware/p/3068471.html
Copyright © 2011-2022 走看看