ref关键字C#中返回类型前的ref关键字是什么意思在下面的代码中,GetAge()方法签名中的ref是什么意思意义?公共类人{私人int年龄;publicrefintGetAge(){returnrefthis.age;}}refreturn是C#7.0中的一个新特性。它允许返回对内存位置的引用。这在以前的C#版本中是不可能的。您甚至可以像这样存储返回的内存位置:varperson=newPerson();//这里我们可以存储对内存区域的引用,我们可以修改它refintage=refperson.GetAge();//像这样age=50;我们一直在研究相同的内存位置,而不是年龄的副本。幕后发生了什么?如果我们有这个代码:publicclassProgram{publicstaticvoidMain(){varperson=newPerson();//这里我们可以存储对内存区域的引用,我们可以修改它refintage=refperson.GetAge();//像这样age=50;}}publicclassPerson{privateintage;publicrefintGetAge(){returnrefthis.age;}}以下是编译器(Roslyn)为该代号幕后操作的内容:usingSystem;使用系统诊断;使用System.Reflection;使用System.Runtime.CompilerServices;使用系统安全;使用System.Security.Permissions;[程序集:AssemblyVersion(“0.0.0.0”)][程序集:Debuggable(DebuggableAttribute.DebuggingModes.Default|DebuggableAttribute.DebuggingModes.DisableOptimizations|DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints|DebuggableAttribute.DebuggingModes.EnableEditAndContinue)][程序集:CompilationRelaxations(8)][程序集:RuntimeCompatibility(WrapNonExceptionThrows=true)][程序集:SecurityPermission(SecurityAction。RequestMinimum,SkipVerification=true)][module:UnverifiableCode]publicclassProgram{publicunsafestaticvoidMain(){Personperson=newPerson();整数*年龄=人。获取年龄();*年龄=50;}}publicclassPerson{privateintage;publicunsafeint*GetAge(){returnrefthis.age;}}好的!!!我想我们都很高兴我们不必处理所有这些恶作剧这个功能什么时候有用?添加reflocal和refreturn可以避免多次复制值或执行取消引用操作,从而使算法更加高效。当您处理值为数据类型(struct)的大型数据结构并且将副本传入和传出方法可能效率不高时,它最有用。例如,假设我们有一个包含一堆结构对象的类:classContainer{privateTile[]tiles=newTile[]{newTile{X=10}};publicTilethis[intx]{get{returntiles[x];}set{tiles[x]=value;}}}publicstructTile{publicintX{get;这样做:varcontainer=newContainer();容器[0].X=10;我们不能这样做,因为编译器会发出以下错误:错误CS1612无法修改'Container.this[int]'的返回值,因为它不是变量,编译器会抛出该错误以明确您的想法你在做什么(修改索引条目),不是你在做什么。您实际上是在修改副本,因此它会强制您这样做。因此,为了能够设置X,您需要在副本上执行此操作:varcontainer=newContainer();变种复制=容器[0];副本.X=10;//现在我们需要将项目设置为复制容器[0]=copy;如您所见,效率不高,尤其是当我们处理大型结构并且我们需要迭代操作其中的许多结构时。使用C#7.0我们可以这样做:publicrefTilethis[intx]{get{returnreftiles[x];现在我们可以直接操作Tile而无需发送副本、制作副本,然后为副本设置原始项目。像这样:varcontainer=newContainer();refTiletile=refcontainer[0];瓷砖.X=10;一个小问题网上有很多例子,它们的语法如下://注意右边缺少refrefintage=person.GetAge();这将导致此错误:无法使用值初始化按引用变量正确的语法是在两边都有一个引用,如下所示:refintage=refperson.GetAge();这里的更多信息是一个SO问题,其中已经讨论了此功能。我想这个问题现在已经成为历史。这是EricLippert撰写的另一篇关于此功能的文章。以上就是C#学习教程:C#中返回类型前的ref关键字是什么意思?分享的全部内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
