Stream.Read如何写入/访问缓冲区参数而不传递ref关键字?

时间:2012-02-26 09:22:25

标签: c#

只是想知道它是如何完成的,而我正处于实施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

2 个答案:

答案 0 :(得分:4)

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

您的ok方法会更改参数的值 - 不会对调用方可见,因为它是一个值参数(参数为通过价值)。但是,如果你要写:

asd[0] = 255;

而不是第一行,那么 的变化将是可见的。那不是改变参数本身;它正在改变参数引用的对象中元素的值。

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

假设我带着我的家庭住址递给你一张纸。如果你擦掉那个地址并写在不同的地址上,这不会改变我居住的地方,是吗?这是您在更改参数值时所做的事情。但是,如果你去纸上的地址并将前门漆成红色,那么当我回家时,我会看到一个红色的前门。您没有更改纸张上的值 - 您已在对象中对纸张上的值进行了更改。这就是Stream.Read所做的。

答案 1 :(得分:1)

数组(它是stream.Read的第一个参数)通过引用传递给堆中的对象(因此您可以访问对象本身,但无法访问在调用代码时保存此引用的变量)和你不需要ref关键字来改变数组元素,但是当你需要实例化一个新数组并将它设置为引用时就行了。