C#中ref和out的相关知识

来源:互联网 发布:ios与js的交互 编辑:程序博客网 时间:2024/05/22 12:09

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都可以把变量从值传递变换为引用传递。

1 0
原创粉丝点击