C#中的代理
2016-06-16 20:24
621 查看
也叫作委托。事实上,代理就是用于定义指向方法的引用。
比如你在你眼前的程序中要调用另一部分程序的内容(方法或属性),但是,你不能保证函数名或者属性名不发生变化,或者根本程序不可见(不是public或者是DLL的程序)。那么就使用代理。
定义如下
在模块初始化时为他们赋值
这样,你就可以向普通函数一样调用他们了
如果你不使用代理,而执意要用public,那么在访问form的子类的对象的值类型成员时,编译器会给出CS1690警告:由于xxx是引用封送类的字段,访问上面的成员可能导致运行时异常。
这是因为form类是MarshalByRefObject的子类,该类旨在设计支持不同程序域的对象进行通信。一般来说,不同程序域的通信有两种方式,第一种就是直接传送对象的副本,另一种是使用代理。MarshalByRefObject使用的的是后一种。当有人要远程访问他的对象是,第一次他会向对方传递代理,然后如果对方调用该代理,就由己方的对象负责执行。
所以,如果你访问form类的对象A所包含的对象B的方法时,就将程序置于依赖远程对象执行的代码的风险之下,所以编译器会发送警告。解决的方法就是把对象B先复制到本地就可以了。
比如你在你眼前的程序中要调用另一部分程序的内容(方法或属性),但是,你不能保证函数名或者属性名不发生变化,或者根本程序不可见(不是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; } }
相关文章推荐
- C# 生成随机索引列表
- 关于C#对图片部分操作(水印、透明度)
- U3D结合第三方库ICSharpCode.SharpZipLib 实现文件夹打包解包
- C# UDP收发请求工具类
- C# 多线程是否结束可通过线程池可以判断
- VS2015中C#版本6.0的新特性 你需要知道
- C#中lambda表达式浅析
- C#中数组、ArrayList和List三者的区别
- [置顶] C# 如何利用反射,将字符串转化为类名并调用类中方法
- 自定义热键的代码(C#)
- C#套接字Socket编程之最简单通信
- C# DateTime 格式化 奇怪问题!
- C# TransactionScope 使用
- C#导出Excel
- C#复习④
- C# 设置鼠标指针
- C#虚基类继承与接口的区别
- C#中实体集合和实体转换成相应的string、XDocument、XElement
- C#复习③
- c# 多态的美丽(虚方法、抽象、接口实现)