gpt4 book ai didi

c# - 为什么 C# 不支持返回引用?

转载 作者:IT王子 更新时间:2023-10-29 03:32:28 26 4
gpt4 key购买 nike

我读到 .NET 支持返回引用,但 C# 不支持。有什么特别的原因吗?为什么我不能做类似的事情:

static ref int Max(ref int x, ref int y) 
{
if (x > y)
return ref x;
else
return ref y;
}

最佳答案

这个问题是 my blog on June 23rd 2011 的主题。感谢您提出很好的问题!

C# 团队正在考虑将其用于 C# 7。有关详细信息,请参阅 https://github.com/dotnet/roslyn/issues/5233

更新:该功能已进入 C# 7!


你是对的; .NET 确实支持返回变量托管引用的方法。 .NET 还支持包含对其他变量的托管引用的局部变量。 (但是请注意,.NET 不支持包含对其他变量的托管引用的字段数组,因为这会使垃圾收集过程过于复杂。还有“对变量的托管引用”类型不可转换为对象,因此不能用作泛型类型或方法的类型参数。)

评论者“RPM1984”出于某种原因要求对这一事实进行引用。 RPM1984 我鼓励您阅读 CLI 规范第 I 部分第 8.2.1.1 节“托管指针和相关类型”以获取有关 .NET 的此功能的信息。

完全有可能创建支持这两种功能的 C# 版本。然后你可以做类似的事情

static ref int Max(ref int x, ref int y) 
{
if (x > y)
return ref x;
else
return ref y;
}

然后用

调用它
int a = 123;
int b = 456;
ref int c = ref Max(ref a, ref b);
c += 100;
Console.WriteLine(b); // 556!

根据经验,我知道可以构建支持这些功能的 C# 版本因为我已经这样做了。高级程序员,尤其是移植非托管​​ C++ 代码的人,经常要求我们提供更多类似 C++ 的能力来使用引用来做事,而不必摆脱实际使用指针和到处固定内存的大锤。通过使用托管引用,您可以获得这些好处,而无需付出搞砸垃圾收集性能的代价。

我们已经考虑了这个功能,并实际实现了足够多的功能来向其他内部团队展示以获得他们的反馈。然而,目前根据我们的研究,我们认为该功能没有足够广泛的吸引力或令人信服的用例,无法使其成为真正受支持的语言功能。我们有其他更高的优先级和有限的时间和精力,所以我们不会很快做这个功能。

此外,正确地执行此操作需要对 CLR 进行一些更改。现在,CLR 将引用返回方法视为合法无法验证,因为我们没有检测这种情况的检测器:

ref int M1(ref int x)
{
return ref x;
}

ref int M2()
{
int y = 123;
return ref M1(ref y); // Trouble!
}

int M3()
{
ref int z = ref M2();
return z;
}

M3 返回 M2 的局部变量的内容,但该变量的生命周期已经结束!可以编写一个检测器来确定引用返回的使用显然违反堆栈安全。我们要做的是编写这样一个检测器,如果检测器不能证明堆栈安全,那么我们将不允许在程序的那部分使用 ref 返回。这样做的开发工作量并不大,但测试团队要确保我们确实获得了所有案例,这会是一个很大的负担。这只是将功能成本增加到目前 yield 不超过成本的地步的另一件事。

如果您能向我描述为什么您需要此功能,我将不胜感激。我们从真实客户那里获得的关于他们为什么想要它的信息越多,它就越有可能在某一天被应用到产品中。这是一个可爱的小功能,如果有足够的兴趣,我希望能够以某种方式将它提供给客户。

(另见相关问题 Is it Possible to Return a Reference to a Variable in C#?Can I use a reference inside a C# function like C++? )

关于c# - 为什么 C# 不支持返回引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6339602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com