我想请教一下下面两句话的对错,请大家帮帮忙:1. 委托既是字段,又是方法2 在C#中事件处理都是通过委托来实现的。
先说谢谢啦

解决方案 »

  1.   

    OTL完全无理 ,不好意思说话了,学习...
      

  2.   

    委托就是一函数指针,只不过用面向对象的方法包装了下
    所以可以说是字段,但不能说是方法
    事件确实是通过委托实现,但在委托上又包装了一层,如果不是自定义的事件,那默认的是用一个列表来支持,+=和-=操作实际上是对这个列表的add和delete的操作,事件的调用就是对这个列表里的所有委托进行一次调用
    自定义的事件就随便怎么实现都可以,没有常规做法
      

  3.   


    这个“就是”二字的根据是什么?是从c++学来的说法,就把“类比”作为根据么?委托跟字段、方法实在是谈不上任何直接关系。一个字段可以定义其类型为委托,一个方法可以定义其参数或者返回值类型为委托,但是这有“是”或者“不是”的关系吗?我看不出为什么会有那种“是”的武断说法。看了4楼的,我才明白为什么会那么去说。事件,就是一种具体的位图,编译器对程序所能够采用的语法进行了限制,使得事件比普通的委托的用法更加专一。委托可以这样用,例如:static void Main(string[] args)
    {
        Action<int> method = abc;
        method(2);
        Func<int, int, int> func = a;
        Console.WriteLine(func(1, 2));
        func += b;
        Console.WriteLine(func(1, 2));
        func += a;
        Console.WriteLine(func(1, 2));
        Console.ReadKey();
    }private static void abc(int x)
    {
        Console.WriteLine("method abc --> hello {0}", x);
    }private static int a(int x, int y)
    {
        Console.WriteLine("func a");
        return x + y;
    }private static int b(int x, int y)
    {
        Console.WriteLine("func b");
        return x - y;
    }
      

  4.   

    事实上,在代码中定义一个Delegate的时候,c#编译器编译出来的仍然是一个 MulticastDelegate。我想这也是很重要的使用委托的知识,“眼见为实”在此是不成立的,必须深入一点。在使用一个有返回值的委托时(既返回的类型不是void时),例如上面例子中的 Func,当你把很多个委托联合起来,得到的结果只是最后一个委托的结果。这时候,可以使用委托的 GetInvocationList() 方法得到每一个委托对象,然后使用foreach来逐一执行它,这样就可以控制中间返回值。
      

  5.   

    可能有点歧义,“在代码中定义一个Delegate的时候”也许写成“在代码中声明一个Delegate类型的变量的时候”更好。如果要理解Delegate,看看Delegate、MulticastDelegate、Action、Action<>、Func<>等源代码中的定义比较好,就能立刻明白其本质。.net framework中有上千种Delegate的具体子类。