黑马程序员技术交流社区

标题: 委托与事件的关系 [打印本页]

作者: net七期王雷    时间: 2013-5-10 22:15
标题: 委托与事件的关系
本帖最后由 net七期王雷 于 2013-5-11 21:51 编辑

委托与事件的关系?最好详细解释一下委托。有代码最好
作者: 许大虾    时间: 2013-5-11 01:23
  由于MSDN含混不清的误导,很多人(包括我以前)认为,其实事件就是一种受限的委托。但实际上不是,事件与委托的关系好比字段与属性的关系。事件实际上是一种委托属性,只不过这个属性重载的不是赋值运算符,而是+=和-=运算符。

    我们知道,对于一个属性而言,对他的赋值和取值运算会被转换为两个方法的调用。

    例如obj.A这个属性,则下面的表达式等同于后面的形式:

obj.A = “aaa”;           obj.set_A( “aaa” );  

string a = obj.A;        string a = obj.get_A();  
    而事件也是一样,假设有一个事件obj.E,则下面的表达式也等同于后面的形式:

obj.E += d;              obj.add_E( d )  

obj.E -= d;              obj.remove_E( d )  
    与属性一样,事件也可以被继承甚至重写。事件也可以是虚的和抽象的,理论上事件的add和remove也可以是有不同的可见性的。

    与属性一样,抽象和虚的事件,其实就是表现为事件的两个方法add和remove是抽象的和虚的。

    但是!事件与属性有一个最明显的不同,也就是属性是必须实现的,事件则是不必的。或者说,事件是最早出现的自动属性。

    与自动属性一样,事件也会创建一个字段来保存对应的委托实例,而这个字段与事件同名且是私有。在C#中,你可以访问到这个字段,因为它真的就是一个字段。

    换言之,当你在C#中写代码时,如果是在类型内部使用类型的事件,其实就是引用到那个自动生成的私有字段。换言之,在类的内部使用事件的时候,你使用的是一个委托字段而不是事件。对这个字段的操作是完全不同于在类的外部使用事件的。

    当然,一旦事件写了add和remove访问器,也就不会被自动实现,也就没有这个私有字段了。同样的,因为这个字段是私有的,所以,在类的外部也是访问不到的。
作者: 许庭洲    时间: 2013-5-11 06:15
本帖最后由 许庭洲 于 2013-5-11 06:16 编辑

1.委托是类型;
2.事件是对象;
3. 事件的内部是用委托实现的。
举例子:
// Declare a delegate
delegate void Printer(string s);
class TestClass
{
    staticvoid Main()
    {
        //Instatiate the delegate type using an anonymous method:
        Printer p = delegate(string j)
        {
           System.Console.WriteLine(j);
        };
        //Results from the anonymous delegate call:
       p("The delegate using the anonymous method is called.");
        //The delegate instantiation using a named method "DoWork":
        p= new Printer(TestClass.DoWork);
        //Results from the old style delegate call:
       p("The delegate using the named method is called.");
    }
    // Themethod associated with the named delegate:
    static void DoWork(string k)
    {
        System.Console.WriteLine(k);
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
输出
The delegate using the anonymous method iscalled.
The delegate using the named method is called.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


作者: 陈晖    时间: 2013-5-11 10:09
事件就是一个私有的委托变量,加上两个方法,
一个是add()方法,能够在外界使用-=进行赋值操作,
一个是remove()方法,能够在外界使用+=进行移除指定方法。
委托是类型,事件是变量。:)
作者: 闫常国    时间: 2013-5-11 19:06
事件是一种特殊的委托




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2