为什么C#中的"out"参数作为语言构造存在?

Ler*_*rve 4 c# out

为什么C#中的"out"参数作为语言构造存在?

详细阐述这个问题

为什么它首先存在?是否有更好的语言功能可以获得"out"参数可以获得的相同效果?

使值类型的行为类似于引用类型,这不奇怪吗?

是不是有更好的方法从方法返回多个值?

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

我不是在问什么

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

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

预期答案格式

我很想听到这样的话:"看,这是一个只能通过使用"out"参数语言结构来解决的问题,这里有一个代码示例......".

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

没有意见.

Han*_*ant 12

C#编译器执行明确的赋值检查.这要求它确切地知道何时分配变量.通常不难理解,任务很容易看出来.

但是有一个角落情况是通过引用另一个方法传递变量.该方法是否要求在调用之前分配变量,然后修改它,或者它是否只分配它?编译器一般无法知道,该方法可能存在于方法体不可用的另一个程序集中.例如,适用于任何.NET Framework程序集.

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


关于这个问题的其他错误答案的一个注释.数据流在pinvoke中也起着重要作用,pinvoke marshaller需要知道转换由非托管函数返回的任何数据.它讲究了VS REF关键字,只对[In][Out]属性.更多关于这个Q + A的细节.


Kri*_*erA 5

一个原因是与Win32 API的兼容性.如果要直接从C#调用它们,Win32 API调用的某些方法声明将需要使用out和/或ref.

您可以在pinvoke.net上找到此类方法声明的一些示例:http://pinvoke.net/search.aspx?search = out&namedspace = [All ]


归档时间:

查看次数:

338 次

最近记录:

7 年,4 月 前