.NET 里delegate和event的区别

最近一朋友找工作面试遇到这么个题目,正好我也对此有点模糊,遂进行了一番资料查询,找到了这个文章:
http://www.cnblogs.com/chengxingliang/archive/2013/05/21/3051912.html
然而爱动手的我,觉得只看文章是不行的,决定动手一试,发现...文章内容并非全对!
文章中说event不能直接用"="赋值,然而经过我的实验,在某些情况下,这其实是可以的.

以下代码就能运行通过:
481370-20171019141231802-1682079024.png

public delegate int di(int a);
public static event di e3;    
static void Main(string[] argv)
{
    e3 = (x) =>
    {
        Console.WriteLine(x);
        return x;
    };
    Console.WriteLine($"ret={e3(1)}");
    Console.ReadKey(true);
}

动手结果令我大为吃惊,居然和文章中说的不同!
后来我将代码改成了这样,才得以论证文章说的结果:
481370-20171019142226693-2020272254.png

public class MyClass
{
    public di d1;
    public event di e1;
    public static event di e2;
}

static void Main(string[] argv)
{
    e3 = (x) =>
    {
        Console.WriteLine(x);
        return x;
    };
    var MC = new MyClass();
    MyClass.e2 = (x) =>
    {
        Console.WriteLine(1);
        return 1;
    };
    MC.e1 = (x) =>
    {
        Console.WriteLine(1);
        return 1;
    };
    MC.e1 += (x) =>
    {
        Console.WriteLine(2);
        return 2;
    };

    Console.WriteLine($"ret={MC.e1(1)}");
    Console.WriteLine($"ret={MC.d1(1)}");
    Console.WriteLine($"ret={e3(1)}");
    Console.WriteLine($"ret={MyClass.e2(1)}");
    Console.ReadKey(true);
}

可以看到class里的event确实是不能直接用=赋值,而且也不能在class外面直接调用,而delegate可以
后续我还做了相关小实验,实验过程就不描述了,以下列出实验收获:

通过这次动手,我得到了比文章上更详细的知识:
1:event在事件发行者class里面是可以通过"="赋值的.
2:delegate可以在声明它的class外部被调用.
3:delegate也可以用"+="添加多个订阅者(文章中没说不行,但也没直接说行,我起初误会为不行,实验证明可以)
4:如果你调用的委托(event也是委托的一种)有返回值,并且有多个订阅者,那么你收到的返回值是最后一个订阅者返回的(一个疑点:为何不返回array呢...)

转载于:https://www.cnblogs.com/DragonStart/p/7692345.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值