C#之委托

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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和表达树的知识。自己总结一下。

以上是关于C#之委托的主要内容,如果未能解决你的问题,请参考以下文章

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

C#编程之委托与事件四

C#基础知识之事件和委托

《C#零基础入门之百识百例》(七十一)委托介绍 -- 战士升级示例

《C#零基础入门之百识百例》(七十二)多波委托 -- 妈妈喊开饭啦

《C#零基础入门之百识百例》(七十六) 委托事件实例练习1 -- 猫捉老鼠