C#托付和事件

C#托付。我看了非常长时间的资料和帖子,
曾经对托付的理解就是托付事实上就是将一个方法作为參数传递给第一个方法。
如今对托付的认识则变了一些的,托付能够实现:
                    1.在两个不能直接调用的方法之间做为桥梁
                    2.当不知详细实现什么的时候适用托付(如事件)
使用一个托付时。须要两个步骤:
1.定义一个托付,就像是定义一个类一样;
2.实例化一个或多个该托付

3.为托付注冊方法
在定义托付的时候,往往会在某类的外部创建,而且是public(相当于全局变量。由于声明托付的目的就是为了把它暴露在类的client进行方法的注冊,假设是private,client对它根本不可见。就无用了
以下用实例来讲一下托付的使用
第一个实例:
场景是这种:1.我叫朋友和朋友的女朋友出来玩  2.我叫朋友出来玩。再带上她女朋友
这个场景(我们看另外一种)里我没有权限叫朋友的女朋友出来玩。!!(你懂的),可是我们能够托付朋友让他叫他女朋友出来。

代码例如以下
<span style="white-space:pre">	</span>#region myOwnExmple
        public delegate void delegate_Exmple();
        public static void TestExmple() {
            Me me = new Me();
            me.Name = "richard【我的名字】";
            Friend f = new Friend();
            f.Name = "neil【我朋友的名字】";
            f.GFName = "leo【我朋友女朋友的名字】";
            //Me没有权限叫f的GF
            me.delegate2 = f.callGF;//注冊方法
            me.callFriend(f);
        }

        public class Me
        {
            public delegate_Exmple delegate2;
            public string Name { get; set; }
            public void callFriend(Friend f)
            {
                Console.WriteLine(Name + "自己肯定先来了");
                Console.WriteLine(f.Name + "已经来了");
                if (delegate2 != null)
                {
                    delegate2();
                }
            }
        }
        public class Friend
        {
            public string Name { get; set; }
            public string GFName { get; set; }
            public void callGF()
            {
                Console.WriteLine(GFName + "已经来了");
            }
        }
        #endregion


第二个实例:
观察者模式(分两种:1.仅仅用托付(在每一个region内,注销的部分)2.将托付和事件结合起来)
<span style="white-space:pre">	</span>#region 观察者模式
        public delegate void delegate_Observe(int temperature);
        public static void TestObserve() {
            Heater heater = new Heater();
            #region 托付   假设使用托付,则必须将托付写在外面(相似于全局变量)
            //heater.delegate1 = new Alarm().MakeAlert;
            //heater.delegate1 += new Monitor().ShowMessage;
            //heater.Boil();
            #endregion

            #region 事件
            heater.eventTellOther += (new Alarm()).MakeAlert;//匿名托付
            heater.eventTellOther += new Monitor().ShowMessage;
            heater.Boil();//先注冊方法再运行
            #endregion
        }

        //观察者模式 热水器被托付(所以要在热水器方法内加入托付)去告诉警示器和显示器去做事情
        public class Heater
        {
            public int Temperature { get; set; }

            #region 使用托付。可是须要全局变量
            //public delegate_Observe delegate1;
            #endregion

            #region 使用事件
            public delegate void TellOther(int Temperature);
            public event TellOther eventTellOther;
            #endregion
            public void Boil()
            {
                for (int i = 0; i <= 100; i++)
                {
                    Temperature = i;
                    if (Temperature % 10 == 0)
                    {
                        #region 使用托付,可是须要全局变量
                        //if (delegate1 != null)  //假设有方法注冊托付变量 
                        //联想到事实上这个托付定义就是一个全局变量,仅仅有不论什么地方将事实上例化,而且为其注冊方法
                        //{
                        //    delegate1(Temperature);  //通过托付调用方法
                        //}
                        #endregion

                        #region 使用事件
                        if (eventTellOther != null)
                        {
                            eventTellOther(Temperature);
                        }
                        #endregion
                    }
                }
            }
        }

        public class Alarm
        {
            public void MakeAlert(int temperature)
            {
                Console.WriteLine("水温已经{0}度,发出呜呜呜的鸣叫声~", temperature);
            }
        }

        public class Monitor
        {
            public void ShowMessage(int temperature)
            {
                Console.WriteLine("水温已经{0}度,显示出信息", temperature);
            }
        }

        #endregion

从第一个样例我们能够略微感觉到托付的优点。

可是无奈接触后不多,不能给出更好的样例,望各位大牛指点。


   
原文地址:https://www.cnblogs.com/mengfanrong/p/5103320.html