在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了。
打印 | 张贴于 2004-04-14 12:07:00 | Tag:学习
留言反馈
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)了,这样说明白吗?