感悟生活

Life is like a box of chocolates. You never know what you're gonna get.
随笔 - 97, 评论 - 982, 引用 - 46

导航

工具

关于

标签

每月存档

广告



访客

 

C# FAQ中看到一篇讨论types polymorphic的随笔。

这个问题还真是有一点迷惑性。我的第一感觉是,用类似public static void Swap(object a, object b);这样的代码就能实现两个object的交换了,因为object是reference type。可是动手试过和看过讨论之后才知道这样是不行的。

实际上,public static void Swap(ref object a, ref object b);的IL是:

.method public hidebysig static void  Swap(object& a, object& b) cil managed

而public static void Swap(object a, object b);的IL是:

.method public hidebysig static void  Swap(object a, object b) cil managed

真正的type polymorphic的解法,自然是Generics了。

相关文章

Loading...

打印 | 张贴于 2004-04-14 12:07:00 | Tag:学习

留言反馈

#re: types polymorphic 编辑
我老天爷,你们在说什么呀
2005-02-01 15:06:00 | [匿名用户:蛙蛙王子]
#回复: types polymorphic 编辑
我想是的
2004-04-17 20:40:00 | [匿名用户:sam1111]
#回复: types polymorphic 编辑
那么如果没有泛型,.net里就做不出通用的Swap()?
2004-04-17 18:13:00 | [匿名用户:Justin Shen]
#回复: types polymorphic 编辑
呵呵,这个我知道:)
2004-04-14 16:18:00 | [匿名用户:sam1111]
#回复: types polymorphic 编辑
// C#
object o, a;
o = a;

// 等价于 C++
object *o, *a;
o = a;

所以是可以交换的,但是:

// C#
swap(o, a);
swap(object o, object a)
{
o = a;
}

// 等价于 C++
swap(o, a);
swap(object *o, object *a)
{
o = a;
}

这是不行的,因为调用swap的时候所给出的参数,实际上是把o和a里面的内容(两个分别指向某个实例的地址值)压倒堆栈里面。因此在swap函数当中进行o = a,实际上只是修改了堆栈当中参数o和a的值,而不是修改全局变量o和a的值。如果要修改全局变量o和a的值,那么就应该将这个变量o和a的地址(注意,不是o和a所指向的对象实例的地址值)交给swap函数。用C++写,就应该是这样的:

object *o, *a;
swap(&o , &a);
void swap(object **o, object **a)
{
*o = *a;
}

那么对应于C#来说,这个函数就应该是void swap(object &o, object &a)了,这样说明白吗?
2004-04-14 15:05:00 | [匿名用户:sumtec]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode MVC Blogger System