ref 和 out 都是引用传递的关键字,两者的意思都是差不多,都是按引用传递。
那么什么是引用?
class Program
{
public static void show(ref string a)
{
a = "测试";
}
static void Main(string[] args)
{
string num="1 ";
show(ref num);
Console.WriteLine(num);
}
}
这段代码输出结果是测试,
class Program
{
public static void show(string a)
{
a = "测试";
}
static void Main(string[] args)
{
string num="1 ";
show(num);
Console.WriteLine(num);
}
}
这段代码输出的结果却是1,对比我们发现如果被ref修饰方法对参数的修改将直接对方法外的参数产生影响,当我们调用被ref修饰的show方法时,其实我们传递的并不是一个数据,而且一个地址!,所以方法里面对参数的操作将会直接对这个内存地址进行操作,这就是引用传递.如果不加ref的show传递的就是数据,方法里面的参数相当于将传进来的数据复制了一份,进行操作,原有数据并没有被操作,那么out和ref 有什么区别了?
两者的区别个人认为是只能从语法上能看出区别,执行都是一样的引用传递。
ref 如果修饰一个方法 实参和形参必须都被修饰,ref在当实参用的时候必须初始化out却可以不用初始化
int i;
show(ref i);//编译不通过
show(out i);//编译通过
ref 传递进来的参数可以直接进行操作而out却不行
int i;
public void show(ref int i){int j=i;}//编译通过
public void show(out int i){int j=i;}编译不通过
ref传递的参数在内部可以不用去修改,但是out却必须在方法结束前赋值.
public void show(ref int i){}//编译通过
public void show(out int i){}编译不通过