在没有引用的情况下覆盖参数的通用方法?

Generic Methods that overwrite parameters without reference?

好吧,这可能是一个非常愚蠢的问题,但无论如何我都会冒我的代表的风险。我对编程很陌生,所以请放轻松;) 所以我是遇到不太明白的东西才入TCP的。 具体来说:

int length = Socket.Receive(MyByteArray);

根据我的理解,此方法 returns 接收到的数据长度 并且 将接收到的数据写入我的字节数组。那么它如何在我不告诉它的情况下写入我的字节数组呢?经过一些研究,我了解到您可以使用引用来做这种事情,但这种方法不需要 "ref MyByteArray" 这让我感到困惑。这是一种不同类型的方法还是方法内部发生的事情(duh)?

在此先感谢你这个非常棒的人。

引用类型传递给方法有时对开发人员来说是一件不直观的事情。考虑这两段代码(都没有使用 ref 关键字):

void Method1(SomeType myObj)
{
    myObj = new SomeType();
}

void Method2(SomeType myObj)
{
    myObj.SomeProperty = 1;
}

第一种方法没有副作用。引用类型被传递到方法中,由于缺少更好的术语,它基本上是 "pointer"(本身按值传递)到内存中的对象。如果将变量设置为内存中的一个new对象,则原来的保持不变。然后内存中有两个对象。 (虽然新方法会在方法结束后消失,因为没有人使用它。)

second 方法,但是, 有副作用。它使用对内存中对象的相同引用,但它修改了对象本身。因此,在调用方法后检查对象的任何内容都会看到该修改。


据推测,Socket.Receive()做了类似于上面第二种方法的事情。它使用引用来修改对象。


为了说明 ref 关键字如何改变这一点:

void Method3(ref SomeType myObj)
{
    myObj = new SomeType();
}

这个场景中,还有一个副作用。任何调用该方法然后检查它发送给该方法的对象的代码都会看到该对象已被新对象替换。在这种情况下,没有第二个 "pointer" 到内存中的相同位置。该方法使用了调用代码使用的实际 指针