Stream.Read如何在不传递ref关键字的情况下写入/访问缓冲区参数

本文关键字:情况下 参数 缓冲区 访问 关键字 ref Read Stream | 更新日期: 2023-09-27 18:26:00

我只是想知道如何做到这一点,我正处于实现stream.Read方法的阶段。我是遗漏了什么,还是只遗漏了一个ref关键字?

private void Form1_Load(object sender, EventArgs e)
{
    byte[] ex = new byte[1] { 0 };
    MessageBox.Show(ex[0].ToString());
    ok(ex);
    MessageBox.Show(ex[0].ToString());
}
private int ok(byte[] asd)
{
    asd = new byte[1] { 255 };
    return 1;
}
//first result: 0
//second result: 0

Stream.Read如何在不传递ref关键字的情况下写入/访问缓冲区参数

这基本上是理解两个重要概念的问题:

  • 引用类型和值类型之间的差异
  • 如何在C中传递参数#

ok方法会更改参数的值,因为是一个值参数(参数按值传递),所以对调用者不可见。然而,如果你要写:

asd[0] = 255;

而不是第一行,则该更改将可见。这并没有改变参数本身;它改变了参数所指对象中某个元素的值。

基本上,.NET中表达式的值从来都不是对象-它总是值类型值或引用-这是解释如何获取到对象的一种方式。

假设我递给你一张写有我家庭地址的纸。如果你把地址擦掉,写在另一个地址上,这不会改变我的生活,是吗?这就是更改参数值时要执行的操作。然而,如果你去纸上的地址,把前门漆成红色,那么当我回家时,我会看到红色的前门。你没有改变这张纸上的值——你在这张纸的值所指的对象内做了一个改变。这就是Stream.Read的作用。

数组的(它是stream.Read的第一个参数)是通过引用传递给堆中的对象的(所以您可以访问对象本身,但不能访问在调用代码中包含此引用的变量),并且您不需要ref关键字来更改数组元素,而是在您需要实例化一个新数组并将其设置为引用时执行。

相关文章: