首页 > 解决方案 > 为什么“out”参数作为语言结构存在于 C# 中?

问题描述

问题

为什么“out”参数作为语言结构存在于 C# 中?

关于问题的详细说明

为什么它首先存在?难道没有更好的语言特性来获得与“out”参数相同的效果吗?

让值类型表现得像引用类型不是很奇怪吗?

没有更好的方法从一个方法返回多个值吗?

这是一个历史性的事情吗,这意味着对于 C# 的第一个版本,没有办法实现使用 out 参数可以实现的东西,但现在有更新的功能,它只是保留在语言中以实现向后兼容性?

我不是在问什么

  1. 我不是在问它做什么
  2. 我不是问它是如何使用的
  3. 我不是在问“ref”和“out”之间的区别是什么
  4. 我读到应该避免使用它并选择其他构造

在阅读类似问题时,我没有发现任何重复项。

预期答案格式

我很想听到类似“看,这是一个只能使用“out”参数语言结构来解决的问题,这是一个代码示例……”。

或者,“看,这曾经是解决以下问题的唯一方法......代码示例......,但由于 C# 版本......更好的解决方法是这样......代码示例......” .

请不要发表意见。

标签: c#out

解决方案


C# 编译器执行明确的赋值检查。这要求它准确知道何时分配变量。通常不难弄清楚,一项任务很容易看到。

但是有一个极端情况是当一个变量通过引用传递给另一个方法时。该方法是否要求在调用之前分配该变量,然后对其进行修改,还是只分配它?编译器通常无法知道,该方法可能存在于另一个程序集中,而方法主体不可用。例如,对于任何 .NET Framework 程序集都是如此。

所以你必须明确它,ref当方法需要在调用之前分配参数时使用,out当方法只分配它时。顺便说一句,很棒的功能,它消除了整个非常常见的错误。


关于此问题的其他不正确答案的注释。数据流在 pinvoke 中也起着重要作用,pinvoke 编组器需要知道是否转换了非托管函数返回的任何数据。它不关注out vs ref 关键字,只关注[In]and[Out]属性。更多关于这个 Q+A中的细节。


推荐阅读