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

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

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

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

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

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

int[] myNums = new int[] { , , , ,  };
int myNum = MyFunc(myNums);

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

ref int myNum = ref MyFunc(myNums);

 

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

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

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

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

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

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

int num = myNum + ; //

  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/

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

C#7.0--引用返回值和引用局部变量的更多相关文章

  1. const引用返回值

    一.引用 引用是别名 必须在定义引用时进行初始化.初始化是指明引用指向哪个对象的唯一方法. const 引用是指向 const 对象的引用: ; const int &refVal = iva ...

  2. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

  3. 常量函数、常量引用参数、常量引用返回值[C++]

    1. 关于常量引用正像在C语言中使用指针一样,C++中通常使用引用 有一个函数... foo()并且这个函数返回一个引用...... & foo()...., 一个指向位图(Bitmap)的引 ...

  4. PHP获取函数返回值的引用

    通过在函数前添加&可以获取函数返回值的引用,如:function &test(){return 10;}

  5. 关于malloc(0)的返回值问题--这两天的总结与实践篇

    就像我在http://www.cnblogs.com/wuyuegb2312/p/3219659.html 文章中评论的那样,我也碰到了被提问这个malloc(0)的返回值问题,虽然感觉这样做在实际中 ...

  6. 再分析 返回值加引用&,const

    本文主要分析,返回&,和返回值加const的作用. 返回& 定义一个数组模板: template<class T>class Array{ enum{size = 100} ...

  7. c++引用返回值

    引用作为函数的返回值时,函数的返回值能够理解为函数返回了一个变量(事实上,函数返回引用时,它返回的是一个指向返回值的隐式指针),因此,值为引用的函数能够用作赋值运算符的左操作数.另外,用引用返回一个函 ...

  8. C++函数返回值与引用

    对于函数的返回值,看似简单,但并非如此,比如: int func(int a);该函数会返回一个int型,如果进行一个调用int result=func(3);会发生什么情况? 首先,func将返回值 ...

  9. DWR3.0 dwr 返回值(数组,集合,Map)

    首先导入项目所需要的包,如下:dwr.jar,commons-logging-1.0.4.jar,版本可以调整 1.web.xml<?xml version="1.0" en ...

随机推荐

  1. 图片识别文字, OCR

    文章引用自: https://www.cnblogs.com/stone_w/archive/2011/10/08/2202397.html 方式一.Asprise-OCR的使用. Asprise-O ...

  2. hp visual user generator

    loadrunder  自动化测试 脚本 用例

  3. W5100S芯片特性

    W5100S是一款硬连线TCP / IP嵌入式以太网控制器,可使使用SPI(串行外设接口)和并行系统的嵌入式系统更容易实现互联网连接 W5100S适合需要稳定的Internet Connectivit ...

  4. 利用python监测linux上的服务(简单实现服务宕掉自动发送邮件)

    python 这里用到了四个python 模块 : import time (时间模块) import re (正则模块) import socket (监测端口模块)import yagmail ( ...

  5. SSM_CRUD新手练习(7)Spring单元测试分页请求

    好久没写这个系列博客了是因为本人去公司实习去了,公司用的是Spring+SpingMvc+Hibernate现在有时间了不管怎么样继续把这个项目写完. 因为机器的原因,我的环境变成了IDEA+orac ...

  6. 利用fork创建子进程

    创建如图的进程: #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<wait. ...

  7. winform判断一个事件是否已经绑定了事件处理函数

    public static class ComponentHelper<T> where T : Control { public static bool HaveEventHandler ...

  8. Java基础--枚举

    1.枚举简介 枚举是由一组固定的常量组成的类型,自定义数据类型. 枚举的常量值一定是可列举的有限值.常量值的类型都是public static final. 下面代码中的Gender 是一种自定义的数 ...

  9. Centos7.x gnome 桌面美化

    一.管理工具 gnome是通过gnome-tweak-tool(优化工具)来管理的,可以在左上角的应用程序->工具里找到. 也可以直接在终端输入gnome-tweak-tool来启动它.启动界面 ...

  10. 开源播放器 ijkplayer (二) :ijkplayer倍速变调问题解决方案

    转载注明出处:http://www.cnblogs.com/renhui/p/6510872.html 之前使用IjkPlayer做播放器的使用的时候,在做倍速播放的时候,发现播放的声音音调明显变高了 ...