c#基础系列之ref和out的深入理解

2020-01-05 09:20:48刘景俊
  • 在方法签名中,按引用将值返回给调用方。此功能在c# 7.0中新加。即:引用返回值。例如:
    
     static ref int GetUserId(int[] allUserid)
     {  
      return ref allUserid[1];
     }
    • 修饰局部变量。(c#7.0新增)
      
       int x = 3;
       ref int x1 = ref x; //注意这里,我们通过ref关键字 把x赋给了x1
       x1 = 2;
       Console.WriteLine($"改变后的变量 {nameof(x)} 值为: {x}");

      运行结果为 2

      • 在struct声明中声明 ref struct 或 ref readonly struct,来实现值类型的引用语义(c#7.2新增,此处不做讨论)

        相同之处

        ref 和out都可以修饰函数的参数,指示参数是以引用方式传递的。

        ref和out在c#编译器下生成的IL代码是相同的。生成的元数据是几乎相同的。有的网络文章说元数据也是一模一样的其实是错误的。元数据中其实是有一位来标志是ref还是out的,仅仅是一个bit的不同。要不然你以为程序执行时怎么区分是ref还是out的呢^ ~ ^

        用ref或者out修饰的函数参数不能设置默认值。因为没有办法为这些参数传递一个有意义的默认值。

        如果一个函数的参数用ref或者out所修饰,那这个函数的调用者传递的参数类型必须和函数定义的相同(继承关系的也不行)。下列的代码是编译不通过的