C# 委托 事件 匿名方法

(*) 委托 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的定义。

原文地址

拓展:点击打开链接

时间: 2024-12-01 22:06:35

C# 委托 事件 匿名方法的相关文章

从.NET中委托写法的演变谈开去(上):委托与匿名方法

在<关于最近面试的一点感想>一文中,Michael同学谈到他在面试时询问对方"delegate在.net framework1.1,2.0,3.5各可以怎么写"这个问题.于是乎,有朋友回复道"请问楼主,茴香豆的茴有几种写法","当代孔乙己",独乐,众乐.看了所有的评论,除了某些朋友认为"的确不该不知道这个问题"之外,似乎没有什么人在明确支持楼主. 不过我支持,为什么?因为我也提过出这样的问题. 这样,我们暂且不提应

一起谈.NET技术,从.NET中委托写法的演变谈开去(上):委托与匿名方法

在<关于最近面试的一点感想>一文中,Michael同学谈到他在面试时询问对方"delegate在.net framework1.1,2.0,3.5各可以怎么写"这个问题.于是乎,有朋友回复道"请问楼主,茴香豆的茴有几种写法","当代孔乙己",独乐,众乐.看了所有的评论,除了某些朋友认为"的确不该不知道这个问题"之外,似乎没有什么人在明确支持楼主. 不过我支持,为什么?因为我也提过出这样的问题. 这样,我们暂且不提应

高阶函数、委托与匿名方法

高阶函数(higher-order function)是指把另一个函数作为参数或返回值的函数.例如 在JavaScript语言中,Function是顶级类型.一个函数就是类型为 Function的顶级对象,自 然就可以作为另一个函数的参数或返回值.例如在Microsoft AJAX Library(ASP.NET AJAX 的客户端类库)中有一个被广泛使用的createDelegate方法.该方法接受一个对象A和一个函 数F作为参数,并返回一个函数R.当调用函 数R时,F函数将被调用,并且保证无

用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

http://www.cnblogs.com/xcj26/p/3536082.html

C#用匿名方法定义委托的实现方法

  本文实例讲述了C#用匿名方法定义委托的实现方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 //用匿名方法定义委托 class Program { delegate string MyDelagate(string val); static void Main(string[] args) { string str1 = " 匿名方法外部 "; //中括号部分定义来了一个方法,没有名称

匿名方法,Lambda表达式,高阶函数

原文:匿名方法,Lambda表达式,高阶函数 匿名方法 c#2.0引入匿名方法,不必创建单独的方法,因此减少了所需的编码系统开销. 常用于将委托和匿名方法关联,例如 1. 使用委托和方法关联: this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);private void btnRefresh_Click(object sender, EventArgs e){    BindData();} 2. 使用委

C#用匿名方法添加事件的问题

<C#高级编程>中有个例子添加事件时用匿名方法: btnOne.Click+=newEventHandler(lblInfo.Text="button1waspressed.";); 调试时提示错误: 错误1应输入) 错误2无效的表达式项")" 请问这是为什么啊 [amandag]: btnOne.Click+=newEventHandler(delegate(){lblInfo.Text="button1waspressed.";}

编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]

原文:编写高质量代码改善C#程序的157个建议[为泛型指定初始值.使用委托声明.使用Lambda替代方法和匿名方法] 前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用.事件本身也是委托,它是委托组,C#中提供了关键字event来对事件进行特别区分.一旦我们

C#委托基础7——匿名方法

C#委托基础系列原于2011年2月份发表在我的新浪博客中,现在将其般至本博客.   class Program { double AddInt(int x, int y) { return x + y; } string AddString(string s1, string s2) { return s1 + s2; } static void Main(string[] args) { Program p = new Program(); // 以为前两个参数为int,他们运行的结果为dou