C# ref与out 区别

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/29 15:55:12
C# ref与out 区别
xW[OW++ǒHmǪRS2& ch*bW bc+ftSB\XDU^j3|3xz/pWS,D$H]z6=;KoENUxΗ@eS; d[^sݏ3GC+]ka* 5$Xnj79ʓ[R\2IEV}vfFoU(Q0]8;M8S+W#͙WEEyDvUb(Qg TV!wY4M8oXVD]Xph~GFQ~9!'gԞZ]ZI E*뒋]ābMkO 9fSv$qS%(lV~dJ,9яN,͝}ЁANE))G8 Z(buRExm0v{Why&2/J3P(h`kil!V=mѱOԙҪJ]/SV"" Y&^@J(}^??E;.~uNPCtSk[OSSÐ1b>"^ C \V#IuFKPS:k/ͮy;J8#*VP*֛oM+]=n@戔kbfD都 ٴ, /b;ak:1S4 VD~h1RCֵREP4wfvo{9Hio XMM1u$ߖiv 6bpG,)WpVAnC.E]Di-)p&SKewhQ)vi :Z< `O(-ii"Ұ4𳂏?8$m d7K_A/;o xIF<))8=Cq{Fb37,j##-;2PFB"M{が (uT4` O<k75Au_b2C,Ê hXQ)P8#f=~ieNa 6Px !K-my]zyq"Ǝ#u%!koʭ,cxKc@Yn= 276>xA>CE'C 'w MCoXM+MxqIe^%MUPCS2R*-< JPD3LЯLҷI*~}Uz,ݓK6I[e_CxdY$E hφAH@Z] I s_ 3و²j &hY |Jؗ㰾,/]'ܕ`\0MLN~~flj

C# ref与out 区别
C# ref与out 区别

C# ref与out 区别
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是只出不进.