探究委托的如何实现非静态方法
2015-02-27 15:06
162 查看
在C#里面对于委托的如何加载非静态方法一直都很疑惑,自己对于非静态方法的认识来看,如果要安全的实现非静态方法必须引用实例里面的
字段,经过查阅资料,知道委托类里面有一个_target字段如果是委托的是静态方法值为零,如果委托是非静态为会自动寻找方法的实例,
说的很模糊,这个_target字段应该是一个object型,但是里面地址指向的什么。我先在程序上声明一个类有两个字段这两个字段一个为static
一个非static,有两个方法一个静态一个非静态,我在方法里面对类的方法进行操作,看看对实例有什么影响。
View Code
结果是
将类改成结构后
结果是
从结果看结构体tt的结果同上面结构体testChange相同,分析可知是浅层复制。
这样看来.net framework在后台给实例方法复制对象时采用的是浅层复制,而不是直接引用地址。
字段,经过查阅资料,知道委托类里面有一个_target字段如果是委托的是静态方法值为零,如果委托是非静态为会自动寻找方法的实例,
说的很模糊,这个_target字段应该是一个object型,但是里面地址指向的什么。我先在程序上声明一个类有两个字段这两个字段一个为static
一个非static,有两个方法一个静态一个非静态,我在方法里面对类的方法进行操作,看看对实例有什么影响。
public delegate void testChangeDelegate(); public class testChange { public int notStaticInt; public static int staticInt; public struct textStruct { public int notStaticInt; public static int staticInt; } public static void staticinWay() { textStruct tt = new textStruct(); Console.WriteLine("方法之前{0} {1}", staticInt,tt.notStaticInt); staticInt += 1; tt.notStaticInt += 1; Console.WriteLine("方法之后{0} {1}", staticInt, tt.notStaticInt); } public void notStaticWay() { textStruct tt = new textStruct(); Console.WriteLine("方法之前{0} {1}", notStaticInt,tt.notStaticInt); notStaticInt += 1; tt.notStaticInt += 1; Console.WriteLine("方法之后{0} {1}", notStaticInt, tt.notStaticInt); } } } testChange tt = new testChange(); testChangeDelegate ttc = new testChangeDelegate(tt.notStaticWay); ttc += tt.notStaticWay; ttc += testChange.staticinWay; ttc += testChange.staticinWay; ttc(); Console.WriteLine(tt.notStaticInt); Console.WriteLine(testChange.staticInt); Console.WriteLine(tt.tt.notStaticInt); Console.WriteLine(testChange.textStruct.staticInt);
View Code
结果是
方法之前0 1 方法之后1 1 方法之前1 0 方法之后2 1 方法之前0 0 方法之后1 1 方法之前1 1 方法之后2 2 2 2 0 2
将类改成结构后
结果是
方法之前0 1 方法之后1 1 方法之前0 0 方法之后1 1 方法之前0 0 方法之后1 1 方法之前1 1 方法之后2 2 0 2 0 2
从结果看结构体tt的结果同上面结构体testChange相同,分析可知是浅层复制。
这样看来.net framework在后台给实例方法复制对象时采用的是浅层复制,而不是直接引用地址。
相关文章推荐
- 详解Kotlin中如何实现类似Java或C#中的静态方法
- 探究 List<T> 集合的Where方法是如何实现的
- 菜鸟如何快速理解实现通讯录——静态方法
- 如何 "使用" 静态方法约束实现类或子类
- 蛙蛙请教:如何利用委托实现多个方法同时调用.
- 如何实现在已有代码之后添加逻辑之继承,组合(静态代理)实现方法
- 利用js方法实现html静态页面间参数传递
- asp如何实现静态面页的生成.
- 如何用自己的方法实现修改盘符
- VC++实现混合静态分裂视窗的方法
- VS2005下自定义用户控件 如何实现属性及方法的相关智能提示
- C#委托的具体实现方法
- 对象间通信方法之一:通过委托实现(C#语言)
- 如何在Java中实现远程方法调用
- 如何:使用回调方法实现异步 Web 服务客户端
- 利用JavaScript方法实现静态html页面参数传递
- VS2005下自定义用户控件 如何实现属性及方法的相关智能提示
- 模式探索(1):采用委托实现模版方法
- 如何在ASP.net中实现限制一个用户名在多个客户端IE登陆的方法
- 如何在线程中给委托方法里的方法传参数