C# 7 ref return for reference types(C#7引用类型的引用返回)
问题描述
我正在浏览一些代码,这些代码使用C#7的新功能并使用引用本地变量和返回功能。
对于value-types
,其中ref局部变量获取引用(对实际存储空间)的引用,以及更新更新原始项的值,似乎非常简单。
稍加解释将有助于理解reference-types
在引用局部变量时内存引用是如何工作的。我指向下面代码的最后一行:
// A simple class
public class CoolClass
{
public string Name { get; set; }
public int Id { get; set; }
public CoolClass(string name, int id) => (Name, Id) = (name, id);
}
//Dummy method that returns first element with Id > 100
public CoolClass GetSpecialItem_Old(CoolClass[] arr)
{
for (int i = 0; i < arr.Length; i++)
if (arr[i].Id > 100)
{
return arr[i];
}
throw new Exception("Not found");
}
//Same as the other one, but returns by ref C# 7
public ref CoolClass GetSpecialItem_New(CoolClass[] arr)
{
for (int i = 0; i < arr.Length; i++)
if (arr[i].Id > 100)
{
return ref arr[i];
}
throw new Exception("Not found");
}
public void TestMethod()
{
var arr = new CoolClass[]
{
new CoolClass("A", 10),
new CoolClass("B", 101),
new CoolClass("C", 11)
};
var byVal = GetSpecialItem_Old(arr); //gets back arr[1]
byVal.Name = "byVal"; //arr[1] = { "byVal", 101 }
byVal = new CoolClass("newByVal", 25); //arr[1] = { "byVal", 101 }
ref var byRef = ref GetSpecialItem_New(arr); //gets back arr[1]
byRef.Name = "byRef"; //arr[1] = { "byRef", 101 }
//Here it has a different behaviour
byRef = new CoolClass("newByRef", 50); //arr[1] = { "newByRef", 50 }
}
推荐答案
C#的原始设计者将该特性命名为"ref"在我看来是一个坏主意。这会让人混淆引用类型和"ref"参数/返回。更好的理解"裁判"的方式是"别名"。也就是说,ref为现有变量提供了另一个名称。
在您的程序中,byRef
是arr[1]
的另一个名称,无论arr[1]
是值类型还是引用类型。如果arr[1]
是字符串变量(请记住,数组元素是变量,您可以更改它们),则byref
也是字符串变量,并且它是名称不同的相同的字符串变量。
arr
也是一个变量;如果更改arr
的值,则byRef
不会出现。无论arr
的值是多少,它都是同一数组的同一插槽的别名。
所以当你说
ref var byRef = ref GetSpecialItem_New(arr); //gets back arr[1]
然后
byRef.Name = "byRef";
与
完全相同arr[1].Name = "byRef";
当你说
byRef = new CoolClass("newByRef", 50);
这与
完全相同arr[1] = new CoolClass("newByRef", 50);
需要注意的是,如果您在分配byRef
后更改了arr
,您仍将拥有原始arr[1]
的别名。
再说一遍:byRef
只是arr[1]
的另一种拼写方式,因此它始终使用byRef
赋值时的arr
值。值类型和引用类型没有不同。
byVal
不是arr[1]
的别名。它是第二个变量,具有arr[1]
内容的副本。当您分配给byVal
时,您不是在分配给arr[1]
。您正在赋值给byVal
,它是一个不同的变量。
arr[1]
的内容是引用,且引用被复制到完全独立的存储位置。
这篇关于C#7引用类型的引用返回的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C#7引用类型的引用返回
基础教程推荐
- 如何激活MC67中的红灯 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- 将 XML 转换为通用列表 2022-01-01