知识大全 理解C#中的代理和事件(一)
Posted 函数
篇首语:古人学问无遗力,少壮工夫老始成。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 理解C#中的代理和事件(一)相关的知识,希望对你有一定的参考价值。
理解C#中的代理和事件(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
突然写这篇文章 真的有点 是在做作的感觉 我想这并不是什么 难以理解的东西 事实上 很多人都写过 而且 我保证至少不比我写的差 可是还是觉得有必要提出来 因为要去正确的理解代理和事件是很有趣的 也是很必要的 那么好吧 下面我就来讲讲 它们之间的关系 当然还会有些例子
首先我想说说有关事件 事件顾名思义当然是windows程序收到的消息
那么我举几个有关事件的例子 如鼠标移动 按下 之类的都是 那么代理呢?很多人都说它看上去 就是想是一个受托管的函数指针 我觉得这种说法很正确 事实如此 在MSDN上 我们经常可以看到 有关代理的 多路广播 这个词我觉得不错 可是不好理解 但我会在下面详细讲解的
代理:(有的书上也翻译成指代或委托 英文是这样一来的 Delegate )
我想很多刚接触C#的人 都会对代理产生兴趣的 事实上也是如此 不了解它 你就没办法来做windows程序 和传统意义上的函数指针有所不同的是 代理在C#中是一种类型 这样它看上去 更安全也 更符合OO精神 代理实际上所做的工作就是通过引用把函数包裹起来并使函数有一个有效的返回值 不知道我这样说是否好理解 那么我举个例子 你去建造房子 很显然 我是在说你所做的事情 那么建造房子就是代理 它指代了 你要做的事情 可是它并没有去做任何事情 事实上是 在建造房子这个工作里 你做了 那么结果是什么?当然是建立一座房子 是的 建造房子就是代理 而如何建造房子则是函数应该完成的工作 而建造的是什么样的房子 则是返回值 还记得 我曾经说过 代理是一种类型吗?呵呵 我想你应该记得 因为 那是很新颖的 至少当时我那么认为 好吧 让我们来看看名称空间System Delagate 看见了吗?那就代理类
举个例子:
public delegate void GetString()//我申明了一个代理
现在我要用到它了如下;
int i= ;
GetString gs=new GetString(i ToString);//这里我吧int的ToString方法填入了一个代理中 看上去想构造函数 这就是常在书上看到的 名称等效的 而不是结构等效的 我想看到这儿你还是不明白 那么 我再来一个代理
如下:
float j= ;
GetString gs=new GetString(j ToString);//瞧见了 int的ToString方法和float的ToString方法的结构是不一样的 可是名称和类型的返回值和参数都一样 现在 我想 你应该理解了吧
可是 我们经常会在MSDN中看到 这样的句子 单路代理和多路广播 看上去 有点不好理解
事实上 我开始看这样的句子 是有点头痛的 那么 我想例子是最好的解说方式
Single Delegate:(单路代理)
从字面上 我们可以这样来理解 这个代理只是单单代理了一个函数的工作 那么好吧 让我们来看看它是如何工作的 下面我就来定义一个这样的代理:
public delegate bool Myfun(string str int i)
现在我再来写一个方法如下:
bool CompareStrToInt(string s int i)
if(s CompareTo(i ToString())== )
return true;
else
return false;
这个方法完成的工作很简单对吧 只是比较字符而已 那么和代理有什么关系呢?还记得我说的话吗?代理就是在把动词名词化 代码如下:
Myfun mf=new (CompareStrToInt);
string s= ;
int i= ;
ConSole WriteLine( Value= +mf(s i));
输出结果:
Value=true
这就是单路代理 它只代理一个 好吧 也许你想看看复杂的例子 更有趣的在后面呢 该是讨论多路广播的时候了
多路广播:
一个代理同时代理几个方法 就是我们前面说到的那样 你去建造房子 现在要不仅仅是建造住宅 还的去建造花园等等其它建筑物 可是它们都是在建造房子 传递的参数也相同返回值的类型也相同都是房屋 那么我们为什么不找一个代理人来完成这样的任务呢?把这些事物交由他一个人来完成不是可以节省我们很多的时间和金钱 是的我们可以那样做System MulticastDelegate 实际上 framework中你还可以找到这个类 多路代理MSDN上翻译成多路广播 事实上它还重载了操作符+= 其实多路广播和单路代理在使用方法上区别不大 你可以看下面的例子
using System;
namespace Multi_castDelegate
/// <summary>
/// Summary description for Class
/// </summary>
class MyClassDelegate
/// <summary>
/// The main entry point for the application
/// </summary>
public delegate string IntDelegate(string s);
using System;
namespace Multi_castDelegate
/// <summary>
/// Summary description for MyImplementingClass
/// </summary>
public class MyClass
public MyClass()
public static string WriteString(string s)
Console WriteLine( Writing string );
return null ;
public static string logString(string s)
Console WriteLine( loging string );
return null ;
public static string TransmitString(string s)
Console WriteLine( Transmitting string );
return null ;
The Main class:
using System;
using System Threading;
namespace Multi_castDelegate
/// <summary>
/// Summary description for Test
/// </summary>
public class Test
public static void Main()
MyClassDelegate StringDelegate
Writer Logger Transmitter;
MyClassDelegate StringDelegate
myDelegate;
Writer=new
MyClassDelegate StringDelegate(MyClass WriteString);
/// calling Writer
Writer( hello i am Writer just acting like Single cast );
Logger=new MyClassDelegate StringDelegate(MyClass logString);
///calling Logger
Logger( hello i am Logger just acting like Single cast );
Transmitter=new MyClassDelegate StringDelegate(MyClass TransmitString);
///calling Transmitter
Transmitter( hello i am Transmitter just acting like Single cast );
///here mydelegate used the Combine method of System MulticastDelegate
///and the delegates bine
myDelegate=(MyClassDelegate StringDelegate)System Delegate Combine(Writer Logger);
myDelegate( used Combine );
///here Transmitter is also added using the overloaded form of Combine
myDelegate+=Transmitter;
myDelegate( Using Overloaded Form );
///now using the Remove method
myDelegate=(MyClassDelegate StringDelegate)System Delegate Remove(myDelegate Writer);
myDelegate( Without Writer );
///overloaded Remove
myDelegate =Transmitter;
myDelegate( Without Transmitter );
System Threading Thread S
(上面的例子是在一个国外网站上找到的 觉得不错 就直接套用了 )
相关参考
深入解析C#编程中的事件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一个事件是一个使对象或类
正确理解C#中的关键字[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! // //MyCl
正确理解C#中的关键字[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! // //MyCl
理解javaScript中的事件驱动 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixin
正确理解C#中的关键字[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!最近有人问到ref关键字
正确理解C#中的ref关键字(续)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!那么我们再来
正确理解C#中的ref关键字(续)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!前几天写了一
自定义事件实现不同窗体间的通讯C#篇 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C#中的事件
浅析Java与C#的事件处理机制(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java与
知识大全 C#中MouseClick和MouseDoubleClick事件
C#中MouseClick和MouseDoubleClick事件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起