对于class来说,默认不就是引用传递吗?struct默认是传值传递的。
Swap(Pen p1, Pen p2)
{
Pen t = p1;
p1 = p2;
p2 = p1;
}
结果调用Swap(p1, p2),未交换。必须要改成
Swap(ref Pen p1, ref Pen p2)才行...Pen是class,默认就应该是引用传递啊。
Swap(Pen p1, Pen p2)
{
Pen t = p1;
p1 = p2;
p2 = p1;
}
结果调用Swap(p1, p2),未交换。必须要改成
Swap(ref Pen p1, ref Pen p2)才行...Pen是class,默认就应该是引用传递啊。
只有
Swap(ref Pen p1, refPen p2)
{
Pen t = p1;
p1 = p2;
p2 = p1;
}然后调用Swap(p1, p2),这时候p1和p2才真正交换了。
确实是按引用传递的。根据你的文章,
事实上C#引用类型就是指针(这个从C++/CLI的语法就可以明白。)如果还不明白,可以用楼上的C#例子,对比这个C++例子。#include <iostream>
void swap1(int *f1, int *f2)
{
int *t = f1;
f1 = f2;
f2 = f1;
}void swap2(int *&f1, int *&f2)
{
int *t = f1;
f1 = f2;
f2 = t;
}void swap3(int *f1, int* f2)
{
int t = *f1;
*f1 = *f2;
*f2 = t;
}void main()
{
int a1 = 1;
int a2 = 2;
int *b1 = &a1;
int *b2 = &a2;
swap1(b1, b2);
std::cout << *b1 << std::endl;
std::cout << *b2 << std::endl;
std::cout << a1 << std::endl;
std::cout << a2 << std::endl;
swap2(b1, b2);
std::cout << *b1 << std::endl;
std::cout << *b2 << std::endl;
std::cout << a1 << std::endl;
std::cout << a2 << std::endl;
swap3(b1, b2);
std::cout << *b1 << std::endl;
std::cout << *b2 << std::endl;
std::cout << a1 << std::endl;
std::cout << a2 << std::endl;
}C#的引用类型和C++的指针类型,完全是相同的行为。
呵呵,工作了十年,写了10年C/C++了,最近搞个C#项目而已。
感觉你对指针的理解还不是很透彻,再仔细想想吧。
c# 的引用 相当于 C++ * or &
你的代码相当于修改了c++ 参数的 指针的 指向的地址, 返回后,参数出栈 , 函数内部的的修改全部无效,所以....