当我们做项目中,常常会遇到过调用其他类的方法,获取方法的返回值作下一个方法的参数。
以前我们的做法是声明一个变量,接收方法的返回值,要返回的值多的就返回数组。
当需要返回的数据越来越多时,我们会发现上面的方法效率很低。
上网查找解决方法时在微软官方教程看到ref与out。他们的作用悄悄解决了上面方法的不足。
微软官方给出的ref定义是:
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字
out的定义:
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字
个人通俗理解就是:调用者将变量作为参数传给有ref或者out的方法,方法执行完之后,方法对参数修改值的话,调用者的变量的值也会改变
例子如下:
写一个学生信息的类
public class student
{
//学生编号
public string studentCode { get; set; }
//学生名称
public string studentName{ get; set; }
//性别
public string sex { get; set; }
//性别
public string age { get; set; }
}
写一个方法 ,里面是通过ref修饰的student类型的变量st
public void setstudent( ref student st)
{
var str = st.studentCode;
if (str.Substring(3,1)=="0")
{
st.sex = "男";
}
else
{
st.sex = "女";
}
st.age = str.Substring(4, 2);
return;
}
然后调用上面方法:
student st = new student();
st.studentCode = "001018";
st.studentName = "甲";
setstudent(ref st);
结果如下图:
Out的用法和ref的一致,只是out的变量参数可以只声明不赋初始值。
注意:out的方法内必须对out 的参数赋值:
例如:
public void setint(out int i)
{
i = 1;//必须给变量赋值,不然会报错
}
个人总结:一般是根据变量的值来给变量赋值的 用ref,好比上面的学生信息;
如果是本来方法里面就有值,只需调用者传个容器过来的就用out。
如果一般是基本数据类型或者是对数值的一些运算的话两种皆可用。