首先:两者都是按地址传递的,使用后都将改变原来参数的数值。
其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,ref是有进有出,out是只出不进。
out:
class Program
{
/*
* out、ref都是引用传递,传递后使用都会改变原有的值
* out是只出不进。ref是有进有出,
*
* out用法,一般用于需要返回多个参数时,如在需要返回分页的数据时 同时返回总条数或者TryParse()会用到
* ref用法,一般用于在改变一个参数时,把他的改变反应到变量中 如在递归中
*
*/
#region Out
static void Main(string[] args)
{
Program p = new Program();
//out传递参数时不用赋值(如果赋值也会被清空)
string out_s;
p.out_func(out out_s);
Console.WriteLine(out_s);
Console.ReadLine();//暂停窗口
}
/// <summary>
/// out传入后需要赋值才能返回
/// </summary>
/// <param name="i"></param>
public void out_func(out string s)
{
s = "out参数已赋值,返回。";
}
#endregion
}
ref:
class Program
{
#region ref
static void Main(string[] args)
{
Program p = new Program();
//ref传递时如果未初始化赋值 则会报错 :使用了未赋值的局部变量“ref_s”
string ref_s = "已初始化。";
p.ref_func(ref ref_s);
Console.WriteLine("返回的ref参数:" + ref_s);
Console.ReadLine();//暂停窗口
}
/// <summary>
/// ref传入前需要赋值,传入后可不做操作返回原值
/// </summary>
/// <param name="s"></param>
public void ref_func(ref string s)
{
Console.WriteLine("传入的ref参数:" + s);
s += "已赋值返回。";
}
#endregion
}
总结起来ref与out差别就是:
- ref在传给方法前需要初始化,out不需要。
- out在方法内必须被赋值,否则会出现编译错误。
- out在传给方法时会被还原至未初始化状态,所以在方法执行前对out参数进行初始化和不进行的效果上是一样的。