ref & out

来源:互联网 发布:ubuntu apache服务器 编辑:程序博客网 时间:2024/05/16 18:47

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){}编译不通过


总结:
1、ref在传递前必须对传递的参数进行初始,但是out却不需要,你可以理解为out是在方法没进行初始的
2、ref可以对参数不进行任何操作,但是out却必须进行一次赋值
3、使用ref和out,形参和实参都必须被修饰,否则不匹配

区别:ref是有进有出,out只有进没有出.



0 0