ref和out的区别在C# 中,既可以通过值也可以通过引用通报参数。通过引用通报参数允许函数成员变动参数的值,并连结该变动。若要通过引用通报参数, 可使用ref或out关键字。ref和out这两个关键字都能够供给相似的功能,其感化也很像C中的指针变量。它们的区别是:
1、使用ref型参数时,传入的参数必需先被初始化。对out而言,必需在要领中对其完成初始化。
2、使用ref和out时,在要领的参数和执行要领时,都要加Ref或Out关键字。以满足匹配。
3、out适合用在需要retrun多个返回值的处所,而ref则用在需要被挪用的要领改削挪用者的引用的时候。
注:在C#中,要领的参数通报有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array)。传值参数无需特别的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。传值参数在要领挪用过程中如果转变了参数的值,那么传入要领的参数在要领挪用完成以后并不因此而转变,而是保存本来传入时的值。传址参数恰恰相反,如果要领挪用过程转变了参数的值,那么传入要领的参数在挪用完成以后也随之转变。实际上从名称上我们可以清楚地看出两者的含义--传值参数通报的是挪用参数的一份拷贝,而传址参数通报的是挪用参数的内存地点,该参数在要领表里指向的是同一个存储位置。
要领参数上的 ref 要领参数关键字使要领引用通报到要领的同一个变量。当控制通报回挪用要领时,在要领中对参数所做的任何变动都将反应在该变量中。
若要使用 ref 参数,必需将参数作为 ref 参数显式通报到要领。ref 参数的值被通报到 ref 参数。
通报到 ref 参数的参数必需最先初始化。将此要领与 out 参数对比,后者的参数在通报到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数通报。
如果两种要领的声明仅在它们对 ref 的使用方面差别,则将呈现重载。但是,无法界说仅在 ref 和 out 方面差此外重载。
out
要领参数上的 out 要领参数关键字使要领引用通报到要领的同一个变量。当控制通报回挪用要领时,在要领中对参数所做的任何变动都将反应在该变量中。
当但愿要领返回多个值时,声明 out 要领非常有用。使用 out 参数的要领仍然可以返回一个值。一个要领可以有一个以上的 out 参数。
若要使用 out 参数,必需将参数作为 out 参数显式通报到要领。out 参数的值不会通报到 out 参数。
不必初始化作为 out 参数通报的变量。然而,必需在要领返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数通报。
网上有很多文章说ref 只传值,,out传地点等等这种说法,仿佛不长短常的准确。以下是我做的实例代码,大家可以去尝尝:
public int RefValue(int i,ref int j)
{
int k = j;
j =222;
return i+k;
}
public int OutValue(int i, out int j)
{
j = 222;
return i + j;
}
private void cmdRef_Click(object sender, EventArgs e)
{
int m = 0;
MessageBox.Show(RefValue(1, ref m).ToString());
MessageBox.Show(m.ToString());
}
private void cmdOut_Click(object sender, EventArgs e)
{
int m;
MessageBox.Show(OutValue(1, out m).ToString());
MessageBox.Show(m.ToString());
}
借网上总结的一句话说,ref是有进有出,而out是只出不进。
原帖地点: