C#中ref和out的相关知识

Posted 博士装呗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中ref和out的相关知识相关的知识,希望对你有一定的参考价值。

C#中变量之间的传递默认是值传递,什么叫值传递呢?就是说,当一个方法需要我事先定义的变量作为参数的时候,默认只是把变量的值传递过去了。
例如:

namespace ConsoleApplication1

    class Program
    
        static void A(int x)
        

            Console.WriteLine(x);
            x++;
            Console.WriteLine(x);
        

        static void Main(string[] args)
        
            int x=0;
            A(x);
            Console.WriteLine(x);
            Console.ReadKey();
        
    

A方法需要Main()方法中的变量x作为参数,此时知识把“0”传递给了方法A,A里面做了x++的运算,但是不影响Main()方法里面x的值,折旧相当于A方法中定义了另一个变量y用来承接x,A里面操作的是y,而不是x,因为A里面定义了一个int x,这两个x是不一样的,因为它们指向不同的地址。

那么我们希望Main()和A()都指向同一个地址的x怎么办呢?
那就不用值传递,用引用传递吧,把一个值作为一个引用传递过去。
ref和out就是专门干这种勾当的!
它们的区别是:用ref的时候要确保值已经被赋值了,而有的时候事先赋值没有意义,那就用out;

namespace ConsoleApplication1

    class Program
    
        static void A(ref int x)  //区别在这里
        

            Console.WriteLine(x);
            x++;
            Console.WriteLine(x);
        

        static void Main(string[] args)
        
            int x=0;
            A(ref x);    //区别在这里
            Console.WriteLine(x);
            Console.ReadKey();
        
    

最后输出:

注意,上面的代码中,int x=0;不给它赋值的话就会报错:

不赋值怎么办呢?那就用out呗:

namespace ConsoleApplication1

    class Program
    
        static void A(out int x)
        
            x = 2;    //这里再给它赋值
            Console.WriteLine(x);
            x++;
            Console.WriteLine(x);
        

        static void Main(string[] args)
        
            int x;
            A(out x);
            Console.WriteLine(x);
            Console.ReadKey();
        
    

运行结果:

事实证明:ref和out都可以把变量从值传递变换为引用传递。

以上是关于C#中ref和out的相关知识的主要内容,如果未能解决你的问题,请参考以下文章

转载:C#中ref和out的区别浅析

C#中ref和out的区别浅析

C# 初识Ref和Out

C#中ref和out的使用小结

C#中out和ref之间的区别

为啥 C# 区分 ref 和 out? [复制]