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

C# Stream.Read如何在不传递ref关键字的情况下写入/访问缓冲区参数?,c#,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()); } pri

我只是想知道如何才能做到这一点,我正在实现
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
关键字来更改数组元素,但是,当您需要实例化一个新数组并将其设置为引用时,请执行此操作。

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

您的
ok
方法更改参数的值-调用者看不到该值,因为它是一个值参数(参数按值传递)。然而,如果你要写:

asd[0] = 255;
而不是第一行,那么更改将是可见的。这并没有改变参数本身;它改变了参数所指对象中元素的值

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


假设我递给你一张写着我家地址的纸。如果你把那个地址擦掉,写在另一个地址上,这不会改变我住的地方,是吗?这就是更改参数值时所做的操作。然而,如果你去那张纸上的地址,把前门漆成红色,那么我回家时就会看到一扇红色的前门。您没有更改纸片上的值-您已经在纸片上的值所指的对象内进行了更改。这就是流式阅读所做的。

我不太确定你是否正确。(检查我的编辑代码并运行它)stream.Read不会创建新数组,它会写入您传递的数组。不,数组不是通过引用传递的-引用是通过值传递的。我怎么会错过这个。。。谢谢,但是。。我认为流。读。读块。。似乎在不使用新数组均衡通过的数组的情况下,只有一个接一个地均衡通过的数组。。这需要时间。。但我很确定这不需要那么多time@haxxoromer:您确实需要更深入地了解引用类型和值类型。在代码中,“ex”是对数组的引用,当调用ok()时,数组被复制到局部变量“asd”中,因此当ok()开始运行时,它们引用相同的数组对象。然后重新分配“asd”,但这不会对原始数组和“ex”引用产生任何影响do<代码>asd[0]=255@ShadowWizard:不,不是。请阅读我的答案。“按引用传递”和“按值传递引用”不是一回事。@Jon我的观点是正确的,谢谢。删除不正确的评论以避免误导。