在c#中 函数参数中 对于引用类型加上 ref 和不加 ref 有什么区别? ref SqlConnection conn当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。SqlConnection conn在方法中对参数所做的任何更改不会回传 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先,应该明白,变量类型有值类型和引用类型两种,值类型在参数传递中是传递副本,引用类型是传递地址。其次,在.NET中没有地址、指针的概念,但还是有引用类型与值类型的区别第三,对于引用类型,可以在函数中对参数进行修改,这个修改仅仅限于对参数的属性等的修改,修改结果会影响到原来的对象,但如果给参数创建一个新的对象,那么就不会影响到原来的对象了比如:一个ArrayList类型的对象arr,作为参数传递给函数后,如果在函数中,对这个对象的元素进行添加和删除,结果将影响arr,但如果在函数中新建一个ARRAYLIST对象,那么就不会对arr有任何的影响。第四,对于值类型,如果要想在函数中改变其原来的值,那么必须传递地址,在.NET(C#)中就是ref限定符,有了这个,传递的就是地址了,比如:一个整数i,通过ref传递给函数后,如果在函数中修改了i的值,结果会影响原来的i的值,但如果传递的不是ref限定的变量则不会有影响。对与引用类型的变量一样的。 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的值变为3f3(ref iArr);//调用完后,iArr的元素数量不变,第一个元素的值变为4f4(iArr);//调用完后,iArr的元素数量不边,第一个元素的值变为5f5(ref iArr);//调用完后,iArr的元素数量变为20,原来的iArr变成孤岛而不可以控制了。f6(iArr);//调用完后,iArr的元素数量不变 triout(笨牛) 是个热心人呀!f5(ref iArr);//调用完后,iArr的元素数量变为20,原来的iArr变成孤岛而不可以控制了。这样原来的数据呢?是不是那块内存没有被释放?这样不是内存泄漏了?当然.NET可以GC的,但是效率还是下来了... 想再问一下 那对于引用类型 什么时候用ref比较好或者是必须?什么时候不要用?谢谢! 回复人: tiandike(天地客) ( ) 信誉:100 2004-9-10 8:28:08 得分: 0 想再问一下 那对于引用类型 什么时候用ref比较好或者是必须?什么时候不要用?谢谢!///////////可以用ref传递数组或当一个方法要返回多个值时等等 一个整数i,通过ref传递给函数后,如果在函数中修改了i的值,结果会影响原来的i的值,但如果传递的不是ref限定的变量则不会有影响。就只这一句说明了问题,搞么子说这么多。晕 楼主:你知道c++么?如果知道就很好理解了,带ref的参数在函数调用时传的是变量的地址,相当于c++中的变量指针,而没有ref的参数在函数调用时传的是变量的拷贝,所以带ref的参数可以在被调函数中被改变值,同时调用函数中相应的实参变量值也会改变,因为它们用的是“一个地址”,明白了么。 完全不同意吔!看下面的代码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 PS:ref含有通过函数的参数返回值的意思,所以即使b被new掉还是会影响a 我感觉引用类型REF,也应该是传对象地址。难道会传值吗?你new一个再赋值,还是修改原对象? 还应该弄清楚问题,C#共有两种数据类型,当函数的参数是引用类型时,那么参数传递一定是通过 ref 形式传递的,这也许就是 ffb(我编) 程序中的原因吧,我是初学者,只有书本知识,没有实践,错了的话,大家不要骂我哟! 其实要注意的一点是:对于值类型的变量,如果没有ref,那么在函数中修改了变量的值是不会影响到原来变量的,但如果加了ref则会影响。对于引用类型的变量,无论是否使用ref,对对象变量的属性进行修改同样会影响原来的变量。但如果对这个对象变量重新new一个(重新赋值),则不会影响原来的。而使用了ref则会影响的。所以,ref是否使用是针对变量级的,不是针对变量的属性的。 listview固定列标题 如何实现站内搜索 获取文件夹下所有文件信息的报错问题 关于泛型,动态指定的问题 数据库连接问题 要做一个FTP SERVER,哪位能给点提示?360度裸体跪谢 《c#入门经典》和《visual c#入门经典》这两本书什么区别? 一帖还未平息,一帖又来侵袭,导出Excel问题 为什么FileStream对像只能执行一次? ADO.NET方面的3个问题 c#里代码的格式不像vb.net里那样能够自动调整呢,格式很难看。是不是我的环境没有配置好? 我想从vb转.net,能否推荐几本书给我。
对与引用类型的变量一样的。
{
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的元素数量不变
是不是那块内存没有被释放?这样不是内存泄漏了?当然.NET可以GC的,但是效率还是下来了...
谢谢!
想再问一下 那对于引用类型 什么时候用ref比较好或者是必须?什么时候不要用?
谢谢!///////////
可以用ref传递数组或当一个方法要返回多个值时等等
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
我是初学者,只有书本知识,没有实践,错了的话,大家不要骂我哟!