out和ref的区别

来源:互联网 发布:两个json对象合并 编辑:程序博客网 时间:2024/05/22 07:52

通常时候,我们使用方法,向方法中传递的值都是一个备份,当方法使用完毕,这个备份也将在内存中被销毁。但是也有很多情况下,方法运行结束后,传递的值发生改变,而调用者需要这些改变后的值。于是这时候我们就引入了两个关键字 ref 和out.
一.相同点
Out和ref都用于改变引用参数的情况,并且部分情况下可以通用:
namespace out和¨ªref
{
    class Program
    {
        static void Main(string[] args)
        {
           test1();
            Console.ReadKey();
        }
        static void test1()
    {
    string str="Hello,World!";
        test2(ref str);
        Console.WriteLine(str);
    }
        static void test2(ref string str)
        {
        str="nihao";
        }
    }
}
以上例子中,将ref更换为out之后,输出结果依然一致
二.不同点
1.如下例子:
namespace out和¨ªref
{
    class Program
    {
        static void Main(string[] args)
        {
           test1();
            Console.ReadKey();
        }
        static void test1()
    {
    string str="Hello,World!";
    test2(out str);
    }
        static void test2(out string str)
        {
        Console.WriteLine(str);//这时候程序编译失败:使用了未赋值的out参数
        }
    }
}
由此可见:out在进入方法时会重新恢复清空状态
而如果将ref换成out则没有任何异常
因为得出结论:ref进入方法时会重新清空自己。
2.如下例子
namespace out和¨ªref
{
    class Program
    {
        static void Main(string[] args)
        {
           test1();
            Console.ReadKey();
        }
        static void test1()
    {
    string str;
    test2(ref str);
    Console.WriteLine(str);//程序报错:使用了未赋值的局部变量
    }
        static void test2(ref string str)
        {
            str = "Hello,World!";
        }
    }
}
以上情况程序再次报错:使用了未赋值的局部变量,
而将方法中的ref换成out之后则程序正常。
由此可见:ref在使用前必须赋值!而out本身进入方法时就会自动清空。
综合以上分析得出结论:两个关键字都可以实现方法中传出多个值,ref更适合用于需要使调用者的值发生改变的地方;out更多用于方法中输出多个值的情况。