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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值