为什么Stream.Read不使用out参数?

时间:2017-09-14 15:16:23

标签: c# .net

根据我的理解,Stream.Read(byte[] buffer, int offset, int count)的缓冲区参数应该是一个out参数似乎是合乎逻辑的,因为该值被读入传入的缓冲区,但事实并非如此。

这是什么原因?我有什么东西可以忽略吗?

3 个答案:

答案 0 :(得分:4)

out仅在实例从方法中分配时使用,并传回。 Stream.Read期望缓冲区在调用方法之前已由程序员创建。刚刚传入现有实例,其中实例中的数据正在被修改,而不是它自己的引用。

虽然out 允许传入现有实例,但保证将返回另一个实例。实际上,即使它允许您传入现有实例,也无法从方法中访问其值。它将参数视为从未分配过。 " CS0269 Use of unassigned out parameter 'value'"

如果在方法返回之前没有为参数赋值,则会出现编译错误。 " CS0177 The out parameter 'value' must be assigned to before control leaves the current method"

答案 1 :(得分:1)

将读取的数据放入已指定的字节数组中。在这种情况下buffer已经被调用代码实例化,并且数组中可能已经有非零字节。如果它被指定为out,则Read方法将创建一个缓冲区,并将其返回。在那种情况下,offsetcount将是多余的,因为它根据自己的发现制作了字节数组,它不需要知道在哪里适合在"正在阅读其数据。

答案 2 :(得分:1)

使buffer成为out参数会降低API的可用性,而不会提供任何改进。

目前,缓冲区的引用传递给方法(因为数组是引用类型),输出直接写入数组。

当缓冲区位于out的调用者外部时,使用Stream.Read可以防止重要的用例 - 例如,它使用的某些类的只读属性。

此外,可用性没有太大改进,因为当调用offsetcount时,从调用者下面交换缓冲区(可能是扩展它)并不是一个合适的操作过程打电话给你。