只是想知道它是如何完成的,而我正处于实施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
答案 0 :(得分:4)
这基本上是理解两个重要概念的问题:
您的ok
方法会更改参数的值 - 不会对调用方可见,因为它是一个值参数(参数为通过价值)。但是,如果你要写:
asd[0] = 255;
而不是第一行,那么 的变化将是可见的。那不是改变参数本身;它正在改变参数引用的对象中元素的值。
基本上,.NET中表达式的值永远不是对象 - 它总是值类型值或引用 - 一种解释如何获取的方法对象。
假设我带着我的家庭住址递给你一张纸。如果你擦掉那个地址并写在不同的地址上,这不会改变我居住的地方,是吗?这是您在更改参数值时所做的事情。但是,如果你去纸上的地址并将前门漆成红色,那么当我回家时,我会看到一个红色的前门。您没有更改纸张上的值 - 您已在对象中对纸张上的值进行了更改。这就是Stream.Read
所做的。
答案 1 :(得分:1)
数组(它是stream.Read
的第一个参数)通过引用传递给堆中的对象(因此您可以访问对象本身,但无法访问在调用代码时保存此引用的变量)和你不需要ref
关键字来改变数组元素,但是当你需要实例化一个新数组并将它设置为引用时就行了。