博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#托付和事件
阅读量:7220 次
发布时间:2019-06-29

本文共 3808 字,大约阅读时间需要 12 分钟。

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

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

代码例如以下
	#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.将托付和事件结合起来)
 
	#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
从第一个样例我们能够略微感觉到托付的优点。

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

 
 

转载地址:http://syhym.baihongyu.com/

你可能感兴趣的文章
安卓机在按HOME键时,UNITY触发的APPLICATION_PAUSE事件
查看>>
人人都是 DBA(IV)SQL Server 内存管理
查看>>
离散数学拾趣(二):逻辑难题
查看>>
Efficient C#:为什么要把泛型作为返回值
查看>>
清华大学刘知远:在深度学习时代用HowNet搞事情
查看>>
[LeetCode] Different Ways to Add Parentheses 添加括号的不同方式
查看>>
Atom 检测php错误扩展linter-php
查看>>
ubuntu下msmtp+mutt的安装和配置
查看>>
第 13 章 sar - System Activity Reporter
查看>>
第 70 章 Oracle 监控
查看>>
vlc相关学习资料汇总及零散技术总结
查看>>
Intellij IDEA 14使用maven3.3.3 问题
查看>>
Java 进制转换
查看>>
Code: UrlBuilder class in JavaScript
查看>>
[LintCode] Best Time to Buy and Sell Stock 买卖股票的最佳时间
查看>>
Android中文合集(5)(126+8篇)(chm格式)
查看>>
解读|百分点凭啥能推出「中国首个行业AI决策系统」
查看>>
Debian里编译内核
查看>>
WPF/E 我将怎么拥抱你?困惑与期待
查看>>
使用python玩跳一跳超详细使用教程
查看>>