一、使用ref、out前缀与不使用前缀的区别
int intParam = 0;
object objParam = null;
public void method(int intParam,object objParam) //intParam是值类型形参, objParam是引用类型形参
{
//do something.....
}
public void Main()
{
method(intParam,objParam) ; //intParam是值类型实参, objParam是引用类型实参
}
不使用前缀时,向方法传递一个实参时,对应的形参会使用实参的一个副本来初始化。对于值类型的实参副本等于该值本身,而对于引用类型的实参副本则等于引用变量的值。 如果为一个形参附加了ref关键字,该参数就会成为实参的一个别名,而不再是实参的一个副本。
二、ref、out的区别
使用ref的参数必须先赋值,out的可以不初始化参数。其余的作用相同。
三、ref应用于引用类型的参数
对于引用类型的参数,加ref前缀,传递的是原引用变量的引用,如果你在方法体内对形参重新赋值,那么将影响到实参,即形参和实参的引用是同一地址;不加ref前缀,传递的是原引用变量的副本,即使你在方法体内对形参重新赋值,不影响实参,即形参和实参的引用是不同的。
示例:
using System; using System.Collections.Generic; using System.Text; namespace Parameters { class WrappedInt { public int number; } class Pass { public static void Value(ref int param) { param = 10; } //使用引用类型的参数,方法体内不对参数的引用做任何修改 public static void Reference(WrappedInt param) { param.number = 50; } //使用加了ref修饰符的引用类型的参数,方法体内对参数的引用做了修改 //由于使用了ref修饰符,所以将影响到实参。 public static void refReference(ref WrappedInt param) { WrappedInt wi = new WrappedInt(); wi.number = 100; param = wi; } //使用未加ref修饰符的引用类型的参数,方法体内对参数的引用做了修改 public static void NorefReference(WrappedInt param) { WrappedInt wi = new WrappedInt(); wi.number = 100; param = wi; } } class Program { static void DoWork() { WrappedInt reParam = new WrappedInt(); Console.WriteLine(reParam.number); Pass.Reference(reParam); //使用引用类型变量,实参和方法体内的形参引用的是同一个地址。 Console.WriteLine(reParam.number); Pass.NorefReference(reParam); //未使用ref修饰符,虽然在方法体内修改了形参的引用,但不影响实参reParam Console.WriteLine(reParam.number); Pass.refReference(ref reParam); //由于使用了ref修饰符,在方法体内修改了形参的引用将影响到实参reParam。 Console.WriteLine(reParam.number); } static void Main(string[] args) { try { DoWork(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }