ref SqlConnection conn
当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
SqlConnection conn
在方法中对参数所做的任何更改不会回传

解决方案 »

  1.   

    首先,应该明白,变量类型有值类型和引用类型两种,值类型在参数传递中是传递副本,引用类型是传递地址。其次,在.NET中没有地址、指针的概念,但还是有引用类型与值类型的区别第三,对于引用类型,可以在函数中对参数进行修改,这个修改仅仅限于对参数的属性等的修改,修改结果会影响到原来的对象,但如果给参数创建一个新的对象,那么就不会影响到原来的对象了比如:一个ArrayList类型的对象arr,作为参数传递给函数后,如果在函数中,对这个对象的元素进行添加和删除,结果将影响arr,但如果在函数中新建一个ARRAYLIST对象,那么就不会对arr有任何的影响。第四,对于值类型,如果要想在函数中改变其原来的值,那么必须传递地址,在.NET(C#)中就是ref限定符,有了这个,传递的就是地址了,比如:一个整数i,通过ref传递给函数后,如果在函数中修改了i的值,结果会影响原来的i的值,但如果传递的不是ref限定的变量则不会有影响。
    对与引用类型的变量一样的。
      

  2.   

    int i=0;int[] iArr=new int[10];iArr[0]=1;void f1(int i)
    {
      i=2;
    }
    void f2(ref int i)
    {
      i=3;
    }void f3(ref int[] arr)
    {
      arr[0]=4;
    }void f4(int[] arr)
    {
      arr[0]=5;
    }void f5(ref int[] arr)
    {
      arr=new int[20];
    }void f6(int[] arr)
    {
      arr=new int[30];
    }调用以上函数:f1(i);//调用完后,i的值不变
    f2(ref i);//调用完后,i的值变为3
    f3(ref iArr);//调用完后,iArr的元素数量不变,第一个元素的值变为4
    f4(iArr);//调用完后,iArr的元素数量不边,第一个元素的值变为5
    f5(ref iArr);//调用完后,iArr的元素数量变为20,原来的iArr变成孤岛而不可以控制了。
    f6(iArr);//调用完后,iArr的元素数量不变
      

  3.   

    triout(笨牛) 是个热心人呀!f5(ref iArr);//调用完后,iArr的元素数量变为20,原来的iArr变成孤岛而不可以控制了。这样原来的数据呢?
    是不是那块内存没有被释放?这样不是内存泄漏了?当然.NET可以GC的,但是效率还是下来了...
      

  4.   

    想再问一下 那对于引用类型 什么时候用ref比较好或者是必须?什么时候不要用?
    谢谢!
      

  5.   

    回复人: tiandike(天地客) ( ) 信誉:100  2004-9-10 8:28:08  得分: 0  
     
     
       
    想再问一下 那对于引用类型 什么时候用ref比较好或者是必须?什么时候不要用?
    谢谢!///////////
    可以用ref传递数组或当一个方法要返回多个值时等等
      

  6.   

    一个整数i,通过ref传递给函数后,如果在函数中修改了i的值,结果会影响原来的i的值,但如果传递的不是ref限定的变量则不会有影响。就只这一句说明了问题,搞么子说这么多。晕
      

  7.   

    楼主:你知道c++么?如果知道就很好理解了,带ref的参数在函数调用时传的是变量的地址,相当于c++中的变量指针,而没有ref的参数在函数调用时传的是变量的拷贝,所以带ref的参数可以在被调函数中被改变值,同时调用函数中相应的实参变量值也会改变,因为它们用的是“一个地址”,明白了么。
      

  8.   

    完全不同意吔!看下面的代码
    private void Form1_Load(object sender, System.EventArgs e)
    {
    Class1 a=new Class1();
    a.a=10;
    aaa(a);
    this.Text=a.a.ToString();
    }
    public void aaa(Class1 b)
    {
    //b=new Class1();
    b.a=-99;
    }
    public class Class1
    {
    public Class1()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    public int a=0;
    }你运行后看看窗体的标题是什么
    a对象的a被修改成了-99,说明不加ref传递的也是引用,而不是副本,即b是a的引用
    修改b就是修改a,但是如果b被new掉,则和a就无关了如果改成这样:
    private void Form1_Load(object sender, System.EventArgs e)
    {
    Class1 a=new Class1();
    a.a=10;
    aaa(ref a);
    this.Text=a.a.ToString();
    }
    public void aaa(ref Class1 b)
    {
    b=new Class1();
    b.a=-99;
    }
    发现即使new掉了这个对象,依然可以修改原来的值,说明加ref传递的是原来变量的地址,即b和a是一个地址,new掉b就是new掉a
      

  9.   

    PS:ref含有通过函数的参数返回值的意思,所以即使b被new掉还是会影响a
      

  10.   

    我感觉引用类型REF,也应该是传对象地址。难道会传值吗?你new一个再赋值,还是修改原对象?
      

  11.   

    还应该弄清楚问题,C#共有两种数据类型,当函数的参数是引用类型时,那么参数传递一定是通过 ref 形式传递的,这也许就是 ffb(我编) 程序中的原因吧,
    我是初学者,只有书本知识,没有实践,错了的话,大家不要骂我哟!
      

  12.   

    其实要注意的一点是:对于值类型的变量,如果没有ref,那么在函数中修改了变量的值是不会影响到原来变量的,但如果加了ref则会影响。对于引用类型的变量,无论是否使用ref,对对象变量的属性进行修改同样会影响原来的变量。但如果对这个对象变量重新new一个(重新赋值),则不会影响原来的。而使用了ref则会影响的。所以,ref是否使用是针对变量级的,不是针对变量的属性的。