• C#之委托(二)


    其实在上一篇委托(一)中,创建委托还是太繁琐了点。代码量过多,可能会妨碍我们对代码和逻辑的理解。有些时候可能处理逻辑的代码都笔声明委托的代码要少,这就不可避免的增加了重复代码的量。所以在c#2中极大的简化了这种方法,在C#3中也出现了Lambda表达式来解决这种问题。我们先看一下最开始的的委托。

    private void Form1_Load(object sender, EventArgs e)
            {
                button1.Click += new EventHandler(LogPlainEvent);
                button1.KeyPress += new KeyPressEventHandler(LogKeyEvent);
                button1.MouseClick += new MouseEventHandler(LogMouseEvent);
            }
    
            static void LogPlainEvent(object sender, EventArgs e)
            {
                Console.WriteLine("LogPlain!");
            }
    
            static void LogKeyEvent(object sender, KeyPressEventArgs e)
            {
                Console.WriteLine("LogKey");
            }
    
            static void LogMouseEvent(object sender, MouseEventArgs e)
            {
                Console.WriteLine("LogMouse");
            }

    在winform中添加如下的代码,其实就是给按钮添加点击事件,press事件和鼠标连续点击事件。

    我们在订阅事件的时候,都需要是使用new KeyPerssEvetHandler(LogKey),但c#2支持从方法组到兼容委托的一个隐试转化。其实方法组就是直接使用方法名而已。

                button1.Click += LogPlainEvent;
                button1.KeyPress += LogKeyEvent;
                button1.MouseClick += LogMouseEvent;

    这样的话就不需要每次都实例化一个委托实例。简化了一部分的代码。

    匿名函数

    当然做一件非常小的事,但也必须创建一个完整的委托,代码量的上升和对智能提示的干扰也是不能让开发人员集中精力在业务逻辑上的重要原因。所以在c#2.0中引入了匿名函数的概念。就是为了解决这个情况。

    首先还是来看看匿名函数用于委托的基本语法吧。

    Action<string> printReverse = new Action<string>(delegate(string text)
                {
                    char[] chars = text.ToCharArray();
                    Array.Reverse(chars);
                    Console.WriteLine(new String(chars));
                });
    
                printReverse("shaoqi");

    其实就是编译器在IL的语言里面生成了一个创建了一个委托。这样有些重复的代码编译器就替你做好了。可以让你的精力集中在代码的逻辑上面。

    Lambda表达式

    然后在C#3.0中出项了Lambda表达式,在一定程度上可以看作是匿名函数的一种演变。Lambda比匿名函数感觉的易读和紧凑。需要注意的一点是Lambda表达式本身并不是委托的类型,但可以通过隐式转换的方式转换成一个委托。然后来看看Lambda表的演变。

                Func<string, int> returnLength;
                returnLength = delegate(string text) { return text.Length; };
                returnLength = (string text) => { return text.Length; };
    
                returnLength = (string text) => text.Length;
    
                returnLength = (text) => text.Length;//隐式推断出
    
                  returnLength = text => text.Length;
    第一个是通过匿名函数创建委托。第二个就是lambda创建的委托。

    下一次会写关于LINQ和表达树的知识。自己总结一下。

  • 相关阅读:
    SQL Server检测是不是数字类型的函数(非ISNUMERIC)
    网页中的QQ和阿里旺旺聊天图标
    转载:用 document.readyState == "complete" 判断页面是否加载完成
    sql server行转列 列转行交叉表实现[转]
    拆分列值
    值得收藏的各类型数据库连接串事例网站
    保留几个图表生成免费资源
    MSN消息提示类(II)
    生成Excel”服务器进程80070005“错误和“异常来自 HRESULT:0x800A03EC”的错误,windows server 2008 32位和64位下的特殊设置。
    winform中DataGridView的某些属性
  • 原文地址:https://www.cnblogs.com/shaoqi/p/6359889.html
Copyright © 2020-2023  润新知