只是想知道它是如何完成的,我正处于实现 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
最佳答案
这基本上是理解两个重要概念的问题:
您的 ok
方法更改了参数 的值 - 不会 对调用者可见,因为它是一个值参数 (参数按值传递)。然而,如果你要写:
asd[0] = 255;
而不是第一行,那么该更改将可见。那并没有改变参数本身;它正在更改参数引用的对象中元素的值。
基本上,.NET 中表达式的值绝不是对象 - 它始终是值类型值或引用 - 一种解释如何获取的方法到一个对象。
假设我递给你一张纸,上面写着我的家庭住址。如果你擦掉那个地址并写在另一个地址上,那不会改变我住的地方,是吗?这就是您更改参数值时正在做的事情。但是,如果你去那张纸上的地址,把前门漆成红色,那么我回家时就会看到红色的前门。您没有更改纸上的值 - 您已经在纸上的值所指的对象内进行了更改。这就是 Stream.Read
所做的。
关于c# - Stream.Read 如何在不传递 ref 关键字的情况下写入/访问缓冲区参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451925/