C#7.0--引用返回值和引用局部变量
一、在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--引用返回值和引用局部变量的更多相关文章
- const引用返回值
一.引用 引用是别名 必须在定义引用时进行初始化.初始化是指明引用指向哪个对象的唯一方法. const 引用是指向 const 对象的引用: ; const int &refVal = iva ...
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
- 常量函数、常量引用参数、常量引用返回值[C++]
1. 关于常量引用正像在C语言中使用指针一样,C++中通常使用引用 有一个函数... foo()并且这个函数返回一个引用...... & foo()...., 一个指向位图(Bitmap)的引 ...
- PHP获取函数返回值的引用
通过在函数前添加&可以获取函数返回值的引用,如:function &test(){return 10;}
- 关于malloc(0)的返回值问题--这两天的总结与实践篇
就像我在http://www.cnblogs.com/wuyuegb2312/p/3219659.html 文章中评论的那样,我也碰到了被提问这个malloc(0)的返回值问题,虽然感觉这样做在实际中 ...
- 再分析 返回值加引用&,const
本文主要分析,返回&,和返回值加const的作用. 返回& 定义一个数组模板: template<class T>class Array{ enum{size = 100} ...
- c++引用返回值
引用作为函数的返回值时,函数的返回值能够理解为函数返回了一个变量(事实上,函数返回引用时,它返回的是一个指向返回值的隐式指针),因此,值为引用的函数能够用作赋值运算符的左操作数.另外,用引用返回一个函 ...
- C++函数返回值与引用
对于函数的返回值,看似简单,但并非如此,比如: int func(int a);该函数会返回一个int型,如果进行一个调用int result=func(3);会发生什么情况? 首先,func将返回值 ...
- DWR3.0 dwr 返回值(数组,集合,Map)
首先导入项目所需要的包,如下:dwr.jar,commons-logging-1.0.4.jar,版本可以调整 1.web.xml<?xml version="1.0" en ...
随机推荐
- kubernetes namespace Terminating
1.kubectl get namespace annoying-namespace-to-delete -o json > tmp.jsonthen edit tmp.json and rem ...
- Java第五次实验
Java第五次实验--网络编程与安全 任务一: 一.实验要求: 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现 ...
- java 多线程通知 CountDownLatch 倒数计数器的使用
package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springframework. ...
- Myeclipse中的tomcat项目的内存溢出
tomcat中 内存溢出 在这里写上 -Xmx1024M -Xms1024M -XX:NewSize=128m -XX:MaxNewSize=128m -XX:PermSize=128m -XX:Ma ...
- centos7 编译安装nginx+tcp转发
一.依赖 1. gcc 安装安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装: yum install gcc-c++ 2. PCRE pc ...
- 学习Acegi应用到实际项目中(5)
实际企业应用中,用户密码一般都会进行加密处理,这样才能使企业应用更加安全.既然密码的加密如此之重要,那么Acegi(Spring Security)作为成熟的安全框架,当然也我们提供了相应的处理方式. ...
- (PMP)第8章-----项目质量管理
过程质量管理,成果质量的管理 戴明理论:PDCA,戴明环 朱兰理论:质量规划,质量控制,质量改进,朱兰三部曲 克鲁斯比理论:零缺陷,质量免费 石川理论:质量圈,因果图,质量管理七大工具:核对表,帕累托 ...
- SGU 176 Flow construction (有源有汇有上下界最小流)
题意:给定 n 个点,m 条有向边,如果有向边的标号是1的话,就表示该边的上界下界都为容量 ,如果有向边的标号为0的哈,表示该边的下界为0,上界为容量 ,现在问,从 1 到 n 的最小流是多少,并输出 ...
- 程序中使用now()函数对性能的影响
这两天从某平台的慢查询日志中发现了一些很简单的,原本执行时间在0.01-0.03s的SQL,慢查询日志中记录的执行时间在2s左右. 排查后发现,表设计及索引建设均没有什么问题.但是SQL语句中使用了n ...
- Django的一些隐性经验
隐性经验 前后信息的沟通 url中的参数 get获取 这个参数可以写在URL当中(可以写多个,写在这里的get函数需要有相应的参数去获取).,也可以在模版中添加(通过?若是直接写则表示在当前的URL中 ...