开发者社区> jiankunking> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C# 委托 事件 匿名方法

简介: (*) 委托 delegate 从最简单的例子开始: namespace ConsoleApplication1 { class Program { // 委托其实就相当于一个类型。这里,类型的名字叫BinaryOp public delegate int BinaryOp(int x, int y); static p
+关注继续查看

(*) 委托 delegate

从最简单的例子开始:

namespace ConsoleApplication1
{    
    class Program
    {
        // 委托其实就相当于一个类型。这里,类型的名字叫BinaryOp
        public delegate int BinaryOp(int x, int y);
        static public int Add(int x, int y)
        {
            return x + y;
        }
        static void Main()
        {
            // 创建一个BinaryOp类型的实例,用静态Add方法初始化
            BinaryOp d = new BinaryOp(Add);
            Console.WriteLine(d(10, 10));
   Console.ReadLine(); 
        }
    }
}

输出结果为:20

上面是静态方法的委托,下面再来看一个实例方法的委托。
class MyClass
{
    private string name;
    public MyClass(string name)
    {
        this.name = name;
    }
    public void DisplayName() 
    {
        Console.WriteLine("{0}", name);
    }
}
class Program
{
    // 委托其实就相当于一个类型。这里,类型的名字叫SimpleDelegate
    public delegate void SimpleDelegate();        
    static void Main()
    {
        MyClass a = new MyClass("A");
        MyClass b = new MyClass("B");
        // 用实例方法DisplayName初始化
        SimpleDelegate d = new SimpleDelegate(a.DisplayName);            
        d();
        d = new SimpleDelegate(b.DisplayName);
        d();
 Console.ReadLine(); 
    }
}

输出结果为:A

                       B  

(*) 事件
委托是个类型,而事件是个成员。看下面的代码:

namespace ConsoleApplication1
{
    public class SimpleMath
    {
        public delegate int BinaryOp(int a, int b); // 定义Binary类型
        public event BinaryOp BinaryEvent; // 定义BinaryEvent成员
        public int Add(int a, int b) { return a + b; }
        public int Substract(int a, int b) { return a - b; }
        public int Calculate() 
        {
            // Raise the event by using the () operator.
            return BinaryEvent(1, 2); // 只能在定义事件的类的内部调用,如果写在外面会编译不过
        }
    }

    class Program
    {
        static void Main() 
        {
            SimpleMath sm = new SimpleMath();
            // sm.BinaryEvent(1, 2); 编译错误!只能在定义事件的类的内部调用
            // 下面两种注册方法效果是一样的,相当于注册了两遍,也的确会依序执行两遍
            sm.BinaryEvent += new SimpleMath.BinaryOp(sm.Add);
            sm.BinaryEvent += sm.Add;
            Console.WriteLine(sm.Calculate()); // 结果是3
            // 下面两种注册方法效果是一样的,相当于注册了两遍,也的确会依序执行两遍
            sm.BinaryEvent += new SimpleMath.BinaryOp(sm.Substract);
            sm.BinaryEvent += sm.Substract;            
            Console.WriteLine(sm.Calculate()); // -1, 只保留最后一次调用的返回值(3,3,-1,-1)
             Console.ReadLine(); 
        }                
    }
}

输出结果为:3

                      -1

(*) 匿名方法
匿名方法的作用是使代码更简化,方便了程序员。如果没有匿名方法,则定义一套事件监听需要这样:

class Program
{
    public delegate void SomeDelegate(); // 定义委托
    
    static void Main()
    {
        SomeType obj = new SomeType();
        obj.SomeEvent += new SomeDelegate(MyEventHandler);
    }
    // 一般来说,定义的MyEventHandler方法只用来响应事件,只在上面那一处地方使用
    public static void MyEventHandler() // 定义委托所调用的方法
    {}
}
上面的代码比较啰嗦,尤其是为委托和它所调用的方法起名字比较费劲我觉得。有了匿名方法以后,仅需要这样:
class Program
{
    static void Main()
    {
        SomeType obj = new SomeType();
        obj.SomeEvent += delegate{
            // 实现事件处理逻辑
        }; // 注意要有分号
    }    
}
与上一段代码相比,省去了SomeDelegate和MyEventHandler的定义。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
委托(二):使用事件来对委托变量进行封装
          接上篇:委托(一):委托与方法                         在以前学习设计模式的时候,我们经常看到这样的代码:                                     可以这样说,委托和事件经常一起使用,感觉挺麻烦的,而且觉得委托已经挺好了,为什么还要加入事件呢?搞得挺复杂的。
809 0
C#中的委托与事件
定义   委托是对函数的封装,可以当做给方法的特征制定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。事件其实就是设计模式中观察者模式在.NET中的一种实现方式,现在还没接触,以后慢慢理解。
497 0
C#之委托和事件
        我想,读者们可能看过一部电影叫《全民目击》,在电影中,富豪林泰婚期将至,准新娘却惨死地下停车场,林泰的富二代女儿林萌萌成为最大嫌疑人,林泰不惜重金聘请国内顶级律师周莉为女儿辩护,而公诉方却是十多年一直追查林泰的童涛。
797 0
C# 委托 事件 匿名方法
(*) 委托 delegate 从最简单的例子开始: namespace ConsoleApplication1 { class Program { // 委托其实就相当于一个类型。这里,类型的名字叫BinaryOp public delegate int BinaryOp(int x, int y); static p
898 0
【转】委托、事件与匿名方法 — 学习委托最好的资料
http://www.cnblogs.com/r01cn/archive/2012/11/30/2795977.html
378 0
c#之委托和事件
一:委托简介委托是一种指针,保持方法的引用委托使得方法可以作为参数进行传递如: public delegate void MyDelegate(); class Program { private static void SayHellow() { Console.
820 0
C# 中的委托和事件
C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量)。
632 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
建立联系方法之一
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载