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

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

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



C#托付和事件的更多相关文章

  1. 再看C#中的托付和事件

    在一口一个设计模式--观察者模式中.我们已经知道怎样应用观察者模式,但通过近期的深入学习,发现观察者模式存在下面缺陷: 1.抽象通知者依赖于抽象观察者: 2.每一个详细观察者被调用的方法必须一致. 比 ...

  2. 【C#】C#托付和事件的实例解说

    using System; namespace delegate_event { // 定义一个猫类 class Cat { // 定义一个名字字段 private string name; // 创 ...

  3. WF4.0——升级技能:托付应用

    回想: 在一个月前,我们刚刚回想了面对象至关重要的部分:托付,详细请移步我们博客:面向对象--一起来复习托付与事件!关于这篇博客的详细内容,不再赘述,在这里我们主要讨论在工作流中的应用及他的详细怎样解 ...

  4. 【C#】与C及OC的不同点

    事实上熟悉这些语言的朋友们深知,这几个语言全然没有可比性. 因为工作须要,近期须要重温C#语言,难免会受到C和OC的基础知识影响. 此篇是本人的一个学习笔记.仅此献给有C/OC基础,须要继续学习C# ...

  5. 小猪的Android入门之路 Day 4 - part 1

    小猪的Android入门之路 Day 4 - part 1 Android事件处理机制之--基于监听的事件处理机制 本节引言: 在開始本个章节前,我们先回想下,如今我们已经知道了android的一些相 ...

  6. 经验19--C#大事

    以前学过C#大事.但我还没有搞懂怎么弄. 这一次,他们下进行了研究. 1.定义参数类,对于参数的传递活动.(可以省略) public class UserEventArgs     {         ...

  7. Android基础新手教程——3.1 基于监听的事件处理机制

    Android基础新手教程--3.1.1 基于监听的事件处理机制 标签(空格分隔): Android基础新手教程 本节引言: 第二章我们学习的是Android的UI控件,我们能够利用这些控件构成一个精 ...

  8. 基于C#的超市收银管理系统

    基于C#的超市收银管理系统 前序 一直在忙学习Qt有关的知识,非常有幸这学期学习了C#.让我也感觉到了一丝欣慰,欣慰的是感觉好上手啊,学了几天顿时懂了.好多控件的使用方法好类似,尽管平时上课没有怎么认 ...

  9. Receiver type ‘X’ for instance message is a forward declaration

    这往往是引用的问题. ARC要求完整的前向引用,也就是说在MRC时代可能仅仅须要在.h中申明@class就能够,可是在ARC中假设调用某个子类中未覆盖的父类中的方法的话.必须对父类.h引用,否则无法编 ...

随机推荐

  1. 通用型CRM还是行业型CRM?-定制为王

    大数据时代,怎样利用工具摆脱繁杂的数据管理之苦,洞察有价值的销售信息,是每一个管理者的迫切须要.Zoho  CRM问世10年来,见证了一个个行业客户怎样在CRM帮助下实现了效率和业绩提升.相同,广泛的 ...

  2. xcode多target

    原文:http://www.codza.com/free-iphone-app-version-from-the-same-xcode-project There are more than 15,0 ...

  3. ASP.NET Web Service应用发布到IIs怎么做

    首先把你写的webservice Publish 到 一个文件夹 D:\MyWebService 下,在IIS下的website里面new一个虚拟目录,别名(Alias)随便输一个(这个别名是用于别的 ...

  4. hdu1520(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:举办一个party,候选人当中有很多人之间有上下级关系,求没有直接上下级的最多的人数. 分 ...

  5. AndroidMainFest.xml file missing!

    今天在导入项目的时候出现了这种错误: 仅仅须要一步 就搞定: projecct --->  clean  又一次编译一下就可以搞定了.

  6. linux--关于shell的介绍

    下面是最近学习shell的一些知识点总结***博客园-邦邦酱好*** 1.什么是shell(1)Shell将我们输入的指令与Kernel沟通,好让Kernel可以控刢硬件来正确无误地工作.(2)我们总 ...

  7. Linux------创建和终止进程

    创建进程: Linux创建两个步骤的新处理:fork()和exec().其中fork创建当前进程的能力(父进程)副本,那个孩子.父子进程只有PID不同.在这之后,该系统具有两个进程,运行相同的操作.父 ...

  8. 利用Javamail接收QQ邮箱和Gmail邮箱(转)

    求大神解答 Java代码: public class SendMailController { //@Autowired private JavaMailSenderImpl mailSender; ...

  9. Linux如何查找大文件或目录总结及在全部目录中查找

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  10. 可兼容IE的jquery.cookie函数方法

    前言 在开发过程中,因为之前有接触过Discuz,就直接拿其common.js里面的getcookie和setcookie方法来使用,做到后面在使用IE来测试的时候,发现这两个方法子啊IE下不起作用, ...