1. public void Foo(ref ArrayList list);2. public void Foo(ArrayList list);

解决方案 »

  1.   

    那你就需要知道ref是什么意思了!
      

  2.   

    谢谢关注:)按我的理解,当调用Foo的时候,两者实际传递的都是list的reference,那么区别何在?
      

  3.   

    有时候需要返回多个值,虽然我们可以使用ref来完成,但仅有的返回值不够,于是你就可以使用ref了。当然out也行,看你需要了!
      

  4.   

    当一个方法接收到一个引用类型的变量的时候,它将获得这个引用(Reference)的一个Copy。由于Ref关键字可以用来向方法传递引用。所以,如果这个功能被误用了——比如:当一个如数组类型的引用对象用关键字Ref传递的时候,被调用的方法实际上已经控制了传递过来的引用本身。这样将使得被调用方法能用不同的对象甚至NULL来代替调用者的原始引用!2000 arrayA | 10000{1,2,3,4,...}内存地址为2000的变量arrayA中其实存放着数组{1,2,3,4,……}的内存起始地址10000。如果一个方法fun()使用fun( arrayA[] )的话,它将顺利的获得数据10000,但这个10000将放在一个Copy中,不会放到内存的2000位置。而这个时候我们如果使用fun( ref arrayA[] )的话,我们得到的值就是2000啦(也就是说,被调用方法能够修改掉arrayA中的那个引用,使之不再指向10000,甚至可以用NULL来代替10000,这样的话,那个10000地址中的数据可能就要被垃圾回收机制清理了。)
      

  5.   

    对引用类型而言,加不加ref都可以达到返回值的效果。
      

  6.   

    The ref method parameter keyword on a method parameter causes a method to refer to the same variable that was passed into the method. Any changes made to the parameter in the method will be reflected in that variable when control passes back to the calling method.jedliu(21世纪什么最贵? 人才!)说的比较全了
      

  7.   

    1. public void Foo(ref ArrayList list);
    能够修改指针的指向,可能导致不安全
    2. public void Foo(ArrayList list);
    仅能修改指向的内容
    对于编译器而言,前者拷贝了一份指针,后者直接操作指针。而对于用户而言,将ref用于引用类型,最大的可能就是引入麻烦,有违M$在其c# faq里面屡次提到的原则,但是M$没有禁止或者给出任何的warning,这就是为何我发此一问
      

  8.   

    ----------------------------上面写错了,重发-------
    1. public void Foo(ref ArrayList list);
    能够修改指针的指向,可能导致不安全
    2. public void Foo(ArrayList list);
    仅能修改指向的内容
    对于编译器而言,后者拷贝了一份指针,前者直接操作指针。而对于用户而言,将ref用于引用类型,最大的可能就是引入麻烦,有违M$在其c# faq里面屡次提到的原则,但是M$没有禁止或者给出任何的warning,这就是为何我发此一问
      

  9.   

    1. 指针以引用方式传递
    public void Foo(ref ArrayList list)
    {
       list = new ArrayList();
    }ArrayList tempList1 = new ArrayList();
    ArrayList tempList2 = tempList1;
    Foo(ref tempList1);结果:tempList2 != tempList1;2. 指针以值方式传递
    public void Foo(ArrayList list)
    {
        list = new ArrayList();
    }ArrayList tempList1 = new ArrayList();
    ArrayList tempList2 = tempList1;
    Foo(tempList1);结果:tempList2 == tempList1;
      

  10.   

    同意楼上。lz可以试一下,只要两个函数的代码体一样,那么list返回的内容是一样的,原因在于此:
       在Net中,除了基本的类型、数组、结构体等值类型之外,其他类型系统都默认为引用类型,既然是引用类型,那么把它作为参数,必然是引用传递,就是直接操作对象本身。ref的作用主要
    是针对值类型的。
      

  11.   

    不一样
    传不传ref ,引用虽然都可以返回值,但传ref是可以改变引用地址,不传ref是无法改变引用地址的
      

  12.   

    public void Foo(ref ArrayList list)比较危险,在函数内部可能把list指向另一个ArrayList,而不仅仅是改变其中的内容。
      

  13.   

    应该还有一点要补充吧:
    对于void Foo(RefTypeA a){}而言,可以传递RefTypeA的子类作为参数。但是对于void Foo(ref RefTypeA a)而言,就不可以传ref sthDerivedFromRefTypeA了。