对于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,默认就应该是引用传递啊。

解决方案 »

  1.   

    这个问题有人解释一下吗?上面那样的Swap函数,结果是p1和p2并未交换。
    只有
    Swap(ref Pen p1, refPen p2)
    {
     Pen t = p1;
     p1 = p2;
     p2 = p1;
    }然后调用Swap(p1, p2),这时候p1和p2才真正交换了。
      

  2.   

    Swap(Pen p1, Pen p2),这种参数是不允许被修改的,所以你要加上ref引用,这样才能修改参数
      

  3.   

    谁告诉你的?还是你自己瞎猜的?【.NET版月经问题】之二【引用类型参数就是按引用传递吗?】
      

  4.   


    确实是按引用传递的。根据你的文章,
    事实上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++的指针类型,完全是相同的行为。
      

  5.   


    呵呵,工作了十年,写了10年C/C++了,最近搞个C#项目而已。
    感觉你对指针的理解还不是很透彻,再仔细想想吧。
      

  6.   

    C++是C++,.NET是.NET,不同平台不同概念...不要把一个体系的经验不加变通地用在另一个毫不相干的体系上...ps:我玩C/C++是15年前的事情了...
      

  7.   

    呃,15年前玩了1年? >_<
      

  8.   

    C++ 和 c# 道理是一样的
    c# 的引用 相当于 C++ * or & 
    你的代码相当于修改了c++ 参数的 指针的 指向的地址, 返回后,参数出栈 , 函数内部的的修改全部无效,所以....