根据我的理解,Stream.Read(byte[] buffer, int offset, int count)
的缓冲区参数应该是一个out参数似乎是合乎逻辑的,因为该值被读入传入的缓冲区,但事实并非如此。
这是什么原因?我有什么东西可以忽略吗?
答案 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方法将创建一个缓冲区,并将其返回。在那种情况下,offset
和count
将是多余的,因为它根据自己的发现制作了字节数组,它不需要知道在哪里适合在"正在阅读其数据。
答案 2 :(得分:1)
使buffer
成为out
参数会降低API的可用性,而不会提供任何改进。
目前,缓冲区的引用传递给方法(因为数组是引用类型),输出直接写入数组。
当缓冲区位于out
的调用者外部时,使用Stream.Read
可以防止重要的用例 - 例如,它使用的某些类的只读属性。
此外,可用性没有太大改进,因为当调用offset
和count
时,从调用者下面交换缓冲区(可能是扩展它)并不是一个合适的操作过程打电话给你。