参数传递(续)之——用Ref和Out关键字的按引用传递,以及用Params关键字传参
用Ref和Out关键字的按引用传递比较分析:
由上文《由String类型分析,所产生的对参数传递之惑的解答》 文,我们对值类型和引用类型,在用以关键字Ref传参时,所产生的可以导致原变量实现改变的结果进行了原因分析。然而用关键字Out的按引用传递(注:文中所说的"按引用传递",从英文翻译对号入座应为Ref,然而此处为了表示在传递时都传递的是参数的地址这一共性,故此处把按Ref关键字和按Out关键字传值,认为是按引用传递的两种方法。),在实现机理上可以达到和按Ref关键字传值完全相同的结果(这点从编译器所变异的代码是相同的这点得以验证!)。对此我们采用上文的测试环境,只对后台代码做适当修改,具体代码如下:
//CopyRight: http://www.cnblogs.com/yangmingming
//Notes: 环境是初始值为空的四个TextBox,前面的Lbel标签标示其作用
//按钮标示调用函数,并通过TextBox值显示对比效果
public partial class ParaDelivery : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
int i = 1;
//int i;
string str = "This is a String";
//string str;
txtItiValue.Text = i.ToString();
txtRefValue.Text = str;
AddValueType(out i);
AddRefType(out str);
txtChangedIntValue.Text = i.ToString();
txtChangedRefValue.Text = str;
}
//两个被调用函数
private void AddValueType(out int funi)
{
funi=2;
}
private void AddRefType(out string funStr)
{
funStr ="This is a changed String";
}
}
然而触发按钮事件的现实结果却完全如按Ref关键字的按引用传递结果,如下图示:
即按Out传值实现了和按Ref传值的效果。然而就细节来说,它们还是具有不同点的,具体概括如下:
1.Out传递方法,可以在函数调用之前未赋值,而按Ref传值在函数调用之前必须要赋值的;
2.目的性不同:Out传递方法,顾名思义,Out主要是为从函数获取值的(因为按引用传递方法可以实现原变量的改变!),进而赋予原变量的,这是主要目的。而按Ref则不是这个目的存在的(它有可能是在调用函数中作为"右值",而并不是为了被更新)。我想这也是设计者针对两种情况分而设定的吧,呵呵~
用Params关键字传值:
先看一演示示例。后台代码即环境布置见说明:
//CopyRight: http://www.cnblogs.com/yangmingming
//Notes: 通过设置两个提交按钮——分别可以实现调用同一个函数,而同时其参数个数不同
// 最后将结果反映在TextBox中
public partial class ParamDelivery : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnSubmit1_Click(object sender, EventArgs e)
{
int i = 1, j = 2, k = 3;
txtDisplaySum.Text = AddParamSum(i, j, k).ToString();
}
protected void btnSubmit2_Click(object sender, EventArgs e)
{
int i = 1, j = 2, k = 3, l = 4, m = 5;
txtDisplaySum.Text = AddParamSum(i, j, k, l, m).ToString();
}
//公共调用函数,实现参数的相加功能
private int AddParamSum(params int[] arrParam)
{
int sum = 0;
for (int i = 0; i < arrParam.Length; i++)
{
sum += i;
}
return sum;
}
}
当分别触发按钮1(btnSubmit1)和按钮2(btnSubmit2),所产生结果见下图示:
可见他们都实现了对各自参数的相加功能,这比使用重载的Add函数要简便的多(况且适应性更强了)。Params的实现机理即是通知编译器要将传递过来参数,包装成数组来处理。
附:在使用Params时注意事项:
1.Params所修饰的只能为一维数组;
2.Params可以修饰任何类型,将函数中类型定义为 Object;
3.在函数中,Params项必须置于最后位置;
综述之,作为对参数传递的补充部分,这里比较了按Ref关键字和按Out关键字的按引用传递,以及C#所提供的对于不定项数组的"智能方法"——Params关键字使用。至此对参数传递相关知识又做了一次回顾,呵呵