您的位置:首页 > 编程语言 > C#

C#中的代理

2016-06-16 20:24 621 查看
也叫作委托。事实上,代理就是用于定义指向方法的引用。

比如你在你眼前的程序中要调用另一部分程序的内容(方法或属性),但是,你不能保证函数名或者属性名不发生变化,或者根本程序不可见(不是public或者是DLL的程序)。那么就使用代理。

定义如下

public delegate UInt32[] getDownLoadParam();
public delegate void messgeFromDataLayer(Int32 info, Int32 info1, Int32 info2);

getDownLoadParam m_getDownLoadParam;
messgeFromDataLayer m_messgeFromDataLayer;


在模块初始化时为他们赋值

m_getDownLoadParam = GetDownLoadParam;
m_messgeFromDataLayer = MessgeFromDataLayer;


这样,你就可以向普通函数一样调用他们了

m_messgeFromDataLayer(1, 0, 0);


如果你不使用代理,而执意要用public,那么在访问form的子类的对象的值类型成员时,编译器会给出CS1690警告:由于xxx是引用封送类的字段,访问上面的成员可能导致运行时异常。

这是因为form类是MarshalByRefObject的子类,该类旨在设计支持不同程序域的对象进行通信。一般来说,不同程序域的通信有两种方式,第一种就是直接传送对象的副本,另一种是使用代理。MarshalByRefObject使用的的是后一种。当有人要远程访问他的对象是,第一次他会向对方传递代理,然后如果对方调用该代理,就由己方的对象负责执行。

所以,如果你访问form类的对象A所包含的对象B的方法时,就将程序置于依赖远程对象执行的代码的风险之下,所以编译器会发送警告。解决的方法就是把对象B先复制到本地就可以了。

using System;

class WarningCS1690: MarshalByRefObject
{
int i = 5;

public static void Main()
{
WarningCS1690 e = new WarningCS1690();
e.i.ToString();   // CS1690

// OK
int i = e.i;//c#是system.int32的别名而已
i.ToString();
e.i = i;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: