C#中解释下out和ref的区别?
6个回答
展开全部
最近在许多论坛上看到关于了ref和out的区别,发现解释的都不非常理想。
我想抄写点官方的解释,然后再来我自己的解释
//如下
方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。
方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。
传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数传递。
//上面的理解起来非常不好理解。下面我说说我自己的看法。
首先:两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。经典!!!
我想抄写点官方的解释,然后再来我自己的解释
//如下
方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。
方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。
传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数传递。
//上面的理解起来非常不好理解。下面我说说我自己的看法。
首先:两者都是按地址传递的,使用后都将改变原来的数值。很多人在论坛上解释说out是按数值传递,是错误的。简单的测试后可以知道out使用也能改变数值的,所以肯定是按照地址传递的。
其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。经典!!!
展开全部
ref修饰参数,说明是引用的传递,也就是说在函数中对参数的操作会改变原来的值;out修饰参数,是说这个参数可以不被初始化,但在函数中一定要有赋值的语句。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ref 要求参数在传递给函数前要初始化,out则不需要,常见于平台调用中
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
out与ref的区别如下:
private void button1_Click(object sender, EventArgs e)
{
//ref,out都能修改传进来的参数的值。
int refInt = 100;
RefValue(ref refInt);
MessageBox.Show(refInt.ToString());
//
int outInt = 100;
outValue(out outInt, 100);
MessageBox.Show(outInt.ToString());
}
//ref
public void RefValue(ref int refInt)
{
refInt += 100;//ref引用不需要初始化
}
//一个函数可以有多个ref参数
public void RefValue(ref int refInt,ref int rInt)
{
refInt += 100;//ref引用不需要初始化
}
//out
public void outValue(out int outInt, int i)
{
outInt = i + 100;//out引用必须初始化
}
/*函数不可以有多个out参数
public void outValue(out int outInt, out oInt,int i)
{
outInt = i + 100;//out引用必须初始化
}*/
private void button1_Click(object sender, EventArgs e)
{
//ref,out都能修改传进来的参数的值。
int refInt = 100;
RefValue(ref refInt);
MessageBox.Show(refInt.ToString());
//
int outInt = 100;
outValue(out outInt, 100);
MessageBox.Show(outInt.ToString());
}
//ref
public void RefValue(ref int refInt)
{
refInt += 100;//ref引用不需要初始化
}
//一个函数可以有多个ref参数
public void RefValue(ref int refInt,ref int rInt)
{
refInt += 100;//ref引用不需要初始化
}
//out
public void outValue(out int outInt, int i)
{
outInt = i + 100;//out引用必须初始化
}
/*函数不可以有多个out参数
public void outValue(out int outInt, out oInt,int i)
{
outInt = i + 100;//out引用必须初始化
}*/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
简单来说,out和ref传递的都是引用而不是值,out侧重于输出使用之前不需赋值而ref在使用之前需要赋值,另外这两个关键字可以变相实现使一个方法输出多个值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询