C# 中的 ref 和 out

C# 中的数值传递分为两种,一种是值传递,一种是引用传递。

值传递

在调用有参函数的时候,对于一些简单类型的传递是赋值形式的传递(例如: int, float 等)这些在传递的时候,就是值传递。

引用传递

在传递函数的时候,不是赋值,而是将参数的地址传递过去。(例如: string, object 等)这些都是引用传递。

那么就出现了一个问题,因为值传递中, 实参将值传递给形参,无论在函数里对行参如何操作,都不会影响实参, 而有时候我们却想在函数里改变实参的数值。例如:

class Program
{
    static void Add(int a, int b)
    {
        a = a + b;
    }

    static void Main(string[] args)
    {
        int a = 10;
        int b = 20;
        Console.WriteLine("a = {0}, b = {1}", a, b);

        Add(a, b);

        Console.WriteLine("a = {0}, b = {1}", a, b);

        Console.ReadKey();
    }

}

如上面的代码,输出的结果:
a = 10, b = 20
a = 10, b = 20

那我如果想要 调用 Add 函数后,改变 a 的值怎么办呢?

这个时候,就需要用到 ref 关键字了

ref

ref 的作用就是 可以改变传递参数的值,传递的是实参的地址。
ref 有两个限制:

  1. 因为可以改变其传递的值,所以实参必须是非常量的变量
  2. 实参必须初始化

使用方法:

class Program
{
    static void Add(ref int a, int b)
    {
        a = a + b;
    }

    static void Main(string[] args)
    {
        int a = 10;
        int b = 20;
        Console.WriteLine("a = {0}, b = {1}", a, b);

        Add(ref a, b);

        Console.WriteLine("a = {0}, b = {1}", a, b);

        Console.ReadKey();
    }

}

这样输出的结果就是
a = 10, b = 20
a = 30, b = 20

out

说到 ref 就会想到另一个关键字 out
当 你想给指定的参数一个输出值时,这个时候就会用到 out ,它的用法跟 ref类似。
只是限制不一样

  1. 给定的参数不需要初始化(如果初始化赋值了,最后在函数调用的时候,也会重新赋值)
  2. 传递的函数必对 out 修饰的变量赋值

代码如下:

class Program
{
    static void Add(int a, out int b)
    {
        b = a;
    }

    static void Main(string[] args)
    {
        int a = 10;
        int b = 20;
        Console.WriteLine("a = {0}, b = {1}", a, b);

        Add(a, out b);

        Console.WriteLine("a = {0}, b = {1}", a, b);

        Console.ReadKey();
    }

}

输出的结果:
a = 10, b = 20
a = 10, b = 10

总结:

ref 和 out 参数都必须是 非常量的变量
ref 参数必须初始化 ,out 参数不必初始化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值