C#基础笔记(委托和事件)

委托:按我自己的理解就是将一个方法交给一个对象(不是代码意义上的对象),让这个对象去帮我调用这个方法;

委托的概念:
委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。

		/// <summary>
        /// 定义委托
        /// </summary>
        /// <returns></returns>
        delegate string Mydelegate();
        static void Main(string[] args)
        {
            //实例化委托  调用方法GetStr
            Mydelegate mydelegate = new Mydelegate(GetStr);
            //实例化委托  调用方法GetStr_1
            Mydelegate mydelegate1 = new Mydelegate(GetStr_1);
            Console.WriteLine(mydelegate());
            Console.WriteLine(mydelegate1());
            Console.ReadKey();
        }

        static string GetStr()
        {
            return "委托调用1";
        }
        static string GetStr_1()
        {
            return "委托调用2";
        }

委托可以让我们不用直接去调用方法体,而是通过我们创建的委托对象去调用

        static void Main(string[] args)
        {
            MyClassA myClassA = new MyClassA();
            MyClassB myClassB = new MyClassB();
            Console.WriteLine(myClassA.AddNum());
            myClassB.anum =new MyClassB.GetMyClassAnum(myClassA.AddNum);
            Console.WriteLine(myClassB.AddNum());
            Console.ReadKey();
        }

        class MyClassA
        {
            public int num = 0;
            public int AddNum()
            {
                return num+=1;
            }
        }
        class MyClassB
        {
            public int num = 10;
            public delegate int GetMyClassAnum();
            public GetMyClassAnum anum;
            public int AddNum()
            {
                return num+ anum();
            }
        }

这是一个不怎么恰当的例子:
定义了两个类MyClassA和MyClassB,两者都有num字段和AddNum方法,MyClassB中多了一个委托;方法也有些不相同;
再看Main方法中的调用

			MyClassA myClassA = new MyClassA();
            MyClassB myClassB = new MyClassB();
            Console.WriteLine(myClassA.AddNum());
            myClassB.anum =new MyClassB.GetMyClassAnum(myClassA.AddNum);
            Console.WriteLine(myClassB.AddNum());

分别实例化两个类,并将MyClassA的方法实例化给了MyClassB的anum委托,最后打印MyClassB中AddNum方法的返回值;

上面代码要做的就是B类的AddNum方法要计算A类中num+1后的值和B类中num的和;这是使用委托实现的代码,一般情况的代码如下:

        static void Main(string[] args)
        {
            MyClassA myClassA = new MyClassA();
            MyClassB myClassB = new MyClassB();
            Console.WriteLine(myClassB.AddNum(myClassA.AddNum()));
            Console.ReadKey();
        }

        class MyClassA
        {
            public int num = 0;
            public int AddNum()
            {
                return num+=1;
            }
        }
        class MyClassB
        {
            public int num = 10;
            public int AddNum(int anum)
            {
                return num+ anum;
            }
        }

一般情况如果要实现刚才的逻辑就需要把A类中的结果参数传递到B类中,使用委托就不需要传递这个参数了;
另外一个需求,当B类中调用AddNum方法对num加几操作时,同时也要对A类中的num做加几的操作,使用委托就可以让B在做加操作的时候自动对A做加操作,而不用我们单独调用A的增加方法,这个就和事件一样,当执行某一操作时触发某一事件。

        static void Main(string[] args)
        {
            MyClassA myClassA = new MyClassA();
            MyClassB myClassB = new MyClassB();
            myClassB.anum = myClassA.AddNum;
            myClassB.AddNum(3);
            myClassA.GetNum();
            Console.ReadKey();
        }

        class MyClassA
        {
            private int num = 0;
            public int AddNum(int N)
            {
                return num+=N;
            }
            public void GetNum()
            {
                Console.WriteLine(num);
            }
        }
        class MyClassB
        {
            private int num = 10;
            public delegate int GetMyClassAnum(int N);
            public GetMyClassAnum anum;
            public int AddNum(int N)
            {
                anum(N);
                return num+= N;
            }
            public void GetNum()
            {
                Console.WriteLine(num);
            }
        }

事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。
C# 中使用事件机制实现线程间的通信;

上面的代码实质上就是用委托实现了事件的功能;为什么还要单独有事件呢?我的理解是事件更安全!因为委托的公共的,你可以调用,别人也一样可以调用;在这个委托可见的地方都可以像方法一样去调用委托,这样你的委托到底是谁调用了你可能并不知道;而事件不一样,事件在其他地方是不可以像方法一样去使用的,也就是别人用不了你的事件;
更新上面代码:

       static void Main(string[] args)
        {
            MyClassA myClassA = new MyClassA();
            MyClassB myClassB = new MyClassB();
            myClassB.anum += myClassA.AddNum;
            myClassB.AddNum(3);
            myClassA.GetNum();
            Console.ReadKey();
        }

        class MyClassA
        {
            private int num = 0;
            public int AddNum(int N)
            {
                return num+=N;
            }
            public void GetNum()
            {
                Console.WriteLine(num);
            }
        }
        class MyClassB
        {
            private int num = 10;
            public delegate int GetMyClassAnum(int N);
            public event GetMyClassAnum anum;
            public int AddNum(int N)
            {
                anum(N);
                return num+= N;
            }
            public void GetNum()
            {
                Console.WriteLine(num);
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值