委托系列08-委托和事件的区别

一、使用

&emsp: 案例:通过委托和事件实现相同的动作

1、委托实现方式

代码:

    public class Cat
    {
        public Action MiaoAction = null;

        /// <summary>
        /// 这个方法仅仅只是Miao一声
        /// 引发的动作---可以放到多播委托中去
        /// </summary>
        public void MiaoDelegate()
        {
            //方式一:
            //if (MiaoAction != null)
            //{
            //    MiaoAction.Invoke();
            //}

            //方式二:
            MiaoAction?.Invoke();//?. 如果不为null ,就执行后面的动作 
        }
    }

1、调用

                    Console.WriteLine("************************this is  delegate****************************");
                    {
                        cat.MiaoAction += new Dog().Wang; //狗叫了
                        cat.MiaoAction += new Mouse().Run;//老鼠跑了
                        cat.MiaoAction += new Mother().Wispher;
                        cat.MiaoAction += new Baby().Cry; // 小孩哭了
                        //cat.MiaoAction += new Mother().Wispher;
                        cat.MiaoAction += new Father().Roar;
                        cat.MiaoAction += new Neighbor().Awake;
                        cat.MiaoAction += new Stealer().Hide;
                        //cat.MiaoAction = null;

                        //执行委托
                        cat.MiaoDelegate();
                    }

2、输出结果

2、事件实现方式

代码:

    public class Cat
    {
        public Action MiaoAction = null;

        /// <summary>
        /// 这个方法仅仅只是Miao一声
        /// 引发的动作---可以放到多播委托中去
        /// </summary>
        public void MiaoDelegate()
        {
            //方式一:
            //if (MiaoAction != null)
            //{
            //    MiaoAction.Invoke();
            //}

            //方式二:
            MiaoAction?.Invoke();//?. 如果不为null ,就执行后面的动作 
        }

        //事件
        public event Action MiaoEventHanlder = null;

        /// <summary>
        /// 这个方法仅仅只是Miao一声
        /// 引发的动作---可以放到多播委托中去
        /// </summary>
        public void MiaoEnvent()
        {
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
            //Console.WriteLine("{0} MiaoEnvent", this.GetType().Name);
            MiaoEventHanlder?.Invoke();//?. 如果不为null ,就执行后面的动作 
        }
    }

1、调用

                        Console.WriteLine("************************this is  MiaoEventHanlder****************************");
                        {
                            cat.MiaoEventHanlder += new Mouse().Run;//老鼠跑了
                            cat.MiaoEventHanlder += new Dog().Wang; //狗叫了
                            cat.MiaoEventHanlder += new Mother().Wispher;
                            cat.MiaoEventHanlder += new Baby().Cry; // 小孩哭了 
                            cat.MiaoEventHanlder += new Father().Roar;
                            cat.MiaoEventHanlder += new Neighbor().Awake;
                            cat.MiaoEventHanlder += new Stealer().Hide;
                            
                            cat.MiaoEnvent();
                        }

3、输出结果对比

4、总结

  委托和事件的实现效果一致。

二、委托和事件的区别

  从上面的案例可以看得出来,委托和事件都能实现同样的效果,那他们之间有什么区别呢?

1、场景一

  下面有个ChildCat类,继承Cat类:

    public class ChildCat : Cat
    {
        public void Show()
        {
            //子类中执行父类的多播委托
            base.MiaoAction(); //可以执行

            //子类中执行父类的事件
            base.MiaoEventHanlder.Invoke();//不能执行
        }
    }

在上面的Show方法中,分别执行父类的多播委托和事件

从上图可以看出,事件不能在它的子类执行。

2、场景二

  分别在其他类(非Cat类的继承类)中,执行多播委托和事件。
执行多播委托:

执行事件:

从上图可以得知:
在其他类中,可以执行多播委托,不能执行事件。

3、为什么会有上面这种现象呢?

  既然委托和事件都能实现同样的效果,那为什么还要再出现一个事件呢?
  主要是从安全性考虑。事件只能在声明它的类里面调用,其他类包括子类都不可以调用。这样就可以调用它只能在声明它的类里面,外部方法不会破坏它的执行逻辑。

推荐这些文章:

asp.net用Console.WriteLine怎么输不出

问题
<P>我想用WebForm测试一些c#程序,觉得用控制台应用程序比较麻烦,我是这样写的</P>
<P>using System;<BR>using System.Data;<BR>using System.Configuration;<BR>using System.Collections;<BR>using System.Web;<BR>using System.Web.Security;<BR>using System.Web.UI;<BR>...

python极简教程08:对象的方法

测试奇谭,BUG不见。
讲解之前,我先说说我的教程和网上其他教程的区别:
1 我分享的是我在工作中高频使用的场景,是精华内容;
2 我分享的是学习方法,亦或说,是指明你该学哪些、该重点掌握哪些内容;
3 基于1和2,你可以按照我的教程学,也可以网上找视频学,也可以看书学……你得明白,掌握学习方法比找学习资料重要得多。
这一场,主讲python的面向对象的第二部分——对象的方法。
目的:掌握Python对象的五个核心方法。
init和new
讲解之前,先上一段代码
class Demo:
def __init__(self, name):
print("init")
...

2021-08-02(console、comfrim)

1、console对象

1、输出信息: console.info()别名 console.log();
2、复合类型表格展示 console.table(obj) || console.table(Array);
3、error('error') 输出出错信息; warn('hey') 输出警告信息;
4、计数:count(); 例console.count('key');
5、计时: star: console.time(); end: console.timeEnd();
6、分组折叠功能: group(); 须和结束分组groupEnd()组合使用
7、追踪函数的调用过程: con...

委托系列07-多播委托之观察者模式

一、案例需求
  有一个Cat类,其中有一个Miao(猫叫)的方法。每次猫叫后,其他动物就会执行响应的动作。
代码:
public class Cat
{
public void Miao()
{
Console.WriteLine("{0} Miao", this.GetType().Name);
}
}

二、普通方式
代码:
public class Cat
{
public void Miao()
{
Console....

C#技术栈入门到精通系列4——委托和事件

阅读目录
1、介绍
2、委托的声明、实例化及调用
  2.1、声明委托
  2.2、实例化委托
  2.3、调用委托
3、泛型委托  3.1、Func<T>委托
  3.2、Action<T>委托
4、Lambda
5、多播委托
  5.1、多播委托实例化
  5.2、多播委托调用和返回结果
  5.3、多播委托的逐个调用
6、事件
  6.1、事件的本质
  6.2、事件用法三部曲
  6.3、事件和多播委托区别
7、参考
返回系列文章目录 
 
源代码下载
1、介绍
  委托的定义和语法和方法很相识,只比方法多了一个修饰关键字 del...

委托系列03-委托的作用与意义

一、需求模拟
分别有武汉人、上海人、广东人,三种不同城市的学生,问候的口语不一样,模拟见面打招呼。
二、代码准备
/// <summary>
/// 学生类
/// </summary>
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int ClassId { get; set; }
public int Age { get; se...

委托系列06-多播委托

一、多播委托的介绍

二、代码准备
/// <summary>
/// 多播委托
/// </summary>
public class CustomMulticastDelegation
{
private void DoNothing()
{
Console.WriteLine("This is DoNothing");
}

private void DoNothing(int i)
{
Cons...

委托系列02-委托的实例化及执行

一、代码准备
/// <summary>
/// 1.无参数无返回值委托
/// </summary>
public delegate void NoReturnNoParaOutClass();
public class CustomDelegate //: MulticastDelegate
{
/// <summary>
/// 2.无参数无返回值委托
/// </summary>
public delegate void No...

委托系列05-Action/Func

一、为什么会有Action和Func

二、Action和Func的声明及区别
1、Action
1、普通委托的声明和调用
委托:
/// <summary>
/// 无参数无返回值委托
/// </summary>
public delegate void NoParamNoReturnDelegate();

/// <summary>
/// 有参数无返回值委托
/// </summary>
/// <pa...

文章标题:委托系列08-委托和事件的区别
文章链接:https://www.dianjilingqu.com/51223.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>