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

标签 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

最佳答案

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

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

asd[0] = 255;

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

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

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

关于c# - Stream.Read 如何在不传递 ref 关键字的情况下写入/访问缓冲区参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451925/

相关文章:

c# - 仅使用反射通过类型参数区分泛型方法?

c# - 根据重量和值(value)将元素存储在 3 辆卡车中的遗传算法

c# - InputArray 作为 Emgu CV 中的参数

c# - 我在哪里可以获得这个选择文件夹对话框?

c# - 验证过程中如何清理 SimpleInjector 创建的实例?

c# - 为什么我的 CreateRibbonExtensibilityObject 方法没有被调用?

c# - (MyClassName)object 与对象作为 MyClassName

c# - 如何使用单个查询将数据集中的多条记录插入到 SQL Server 2005 中?

c# - 如何在 C# 中使用 win2D.uwp 将文本写入图像时旋转文本?

c# - F#:实现 "try cast"函数,参数化 "subtype of"约束不起作用