C#7.0--引用返回值和引用局部变量

  一、在C#7.0以上版本中,方法的返回值可以通过关键字ref指定为返回变量的引用(而不是值)给调用方,这称为引用返回值(Reference Return Value,或ref returns);
  1.与引用参数一样,使用关键字ref声明引用返回值:

public ref int MyFunc(int[] nums)
{
    //do…
    return ref nums[0];
}

  2.使用引用返回值避免了值类型在方法返回时的浅拷贝操作,提高了效率;

  3.使用引用返回值通常是为了让调用方有权访问(和修改)此变量,因此引用返回值不支持无返回值方法(即返回值类型为void);
引用返回值所返回变量指向对象的生命周期必须大于方法,即不能返回指向值类型局部变量的变量(值类型局部变量会在方法执行完返回时进行回收),可以返回指向引用类型局部变量的变量、传递给方法的引用参数、静态字段和实例字段;

  ※引用返回值不可以返回字面量、常量、枚举或按值返回的方法、属性,但可以返回当前值为null的符合上述条件的变量;
  ※异步方法不能使用引用返回值,因为异步方法可能会在执行尚未完成且返回值未知时就返回;
  4.查看声明引用返回值方法的IL代码:

  5.在调用引用返回值的方法时,调用方可以选择将方法返回的变量当作按值返回或是按引用返回处理,如果是按值返回处理,则与调用普通方法一样:

int[] myNums = new int[] { 1, 2, 3, 4, 5 };
int myNum = MyFunc(myNums);

  6.如果是按引用返回处理,则调用方需要使用引用局部变量(Reference Local Variable,或ref locals)接收,保留对方法返回变量的引用:

ref int myNum = ref MyFunc(myNums);

 

  二、可以使用关键字ref声明引用局部变量、初始化引用局部变量及调用引用返回值的方法:

ref int myNum = ref myNums[0]; //此时引用局部变量myNum保存的是数组myNums中索引0的内存地址

  1.使用引用局部变值避免了值类型在赋值时的浅拷贝操作,提高了效率;

  2.引用局部变量必须在声明时进行初始化,初始化时会确认该引用局部变量的作用范围,这个作用范围决定该引用局部变量能否作为引用返回值返回;
对引用局部变量的赋值操作,将直接改变该变量所指向内存地址中对象的值:

myNum = 10;
Console.WriteLine(myNums[0]); //10

  3.对引用局部变量的读取操作与普通局部变量一样,将访问该变量所指向内存地址中对象的值:

int num = myNum + 10; //20

  4.引用局部变量可以作为引用参数的实参传递,同样需要使用修饰符ref修饰,对于给定的方法:

public void MyFunc(ref int num) { }
//使用时:
MyFunc(ref myNum);

  5.在C#7.3以上版本中,可以对引用局部变量重新分配其它引用:

myNum = ref MyFunc(myNums); 

  ※给引用局部变量重新分配不能改变该引用局部变量在声明时确认的作用范围,因此不能给一个作用范围较大的局部引用变量赋值一个作用范围较小的变量;

 


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @ 2019-01-23 15:30 Minotauros 阅读(...) 评论(...) 编辑 收藏