栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

这个问题是我在2011年6月23日发布的博客的主题。感谢您提出的好问题!

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返回。这样做并不是大量的开发工作,但是要确保我们确实掌握了所有情况,这对测试团队来说是沉重的负担。这只是将功能成本增加到目前收益不超过成本的另一件事。

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

(另请参阅相关问题,是否有可能在C#中返回对变量的引用?并且可以在C
++之类的C#函数中使用引用吗?)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506815.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号