2012-02-26 45 views
3

只是想知道它是如何完成的,而且我正在实施stream.Read方法。我是否错过了某些东西,或者只有ref关键字缺失或什么?Stream.Read如何写入/访问缓冲区参数而不传递关键字?

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 
+0

那么我的代码有什么问题? – haxxoromer 2012-02-26 09:33:11

+0

而不是'asd = new byte [1] {255};'do'asd [0] = 255;' – 2012-02-26 09:34:24

+0

@ShadowWizard:不,它不是。请阅读我的答案。 “通过引用传递”和“通过价值传递”是*不是同一件事。 – 2012-02-26 09:37:59

回答

4

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

ok方法改变参数的价值 - 这不会对调用者来说是可见的,因为它是一个值参数(参数是通过值传递的)。但是,如果你写:

asd[0] = 255; 

,而不是第一行,那么这种改变可见。这不会改变参数本身;它正在改变参数引用的对象内的一个元素的值。

基本上,在.NET表达式的值是从来没有的对象 - 它总是一个值类型值或参考 - 解释如何得到到对象的一种方式。

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

1

Array的(这是stream.Read第一个参数)按引用传递堆到对象(所以你必须访问对象本身,而不必访问该持有的本参考中调用代码变量)和你不需要ref关键字来改变数组元素,但是当你需要实例化一个新数组并将其设置为引用时。

+0

我不太确定你是对的。 (检查我的编辑代码并运行它) – haxxoromer 2012-02-26 09:30:24

+0

stream.Read不会创建一个新数组,它将写入您通过它的一个。 – 2012-02-26 09:33:50

+0

不,数组不通过引用传递 - 引用是按值传递的。 – 2012-02-26 09:35:08