好的,这可能是一个非常愚蠢的问题,但是无论如何我都会冒我的代表的风险。我对编程很陌生,所以请放轻松吧;)
因此,当我遇到一些我不太了解的内容时,我才进入TCP。
再具体一点:

int length = Socket.Receive(MyByteArray);


据我了解,此方法返回接收到的数据的长度,并将接收到的数据写入我的字节数组。那么,如何在不通知我的情况下将其写入我的字节数组?经过一些研究,我了解到您可以使用引用来执行此类操作,但是此方法不需要“ ref MyByteArray”,这使我感到困惑。这是另一种方法,还是方法内部的内容(duh)?

在此先感谢您,您真棒。

最佳答案

对于开发人员而言,将引用类型传递给方法有时可能是不直观的事情。考虑以下两段代码(都不使用ref关键字):

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

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


第一种方法没有副作用。引用类型被传递给该方法,由于缺少更好的术语,该引用类型基本上是指向内存中对象的“指针”(本身通过值传递)。如果将变量设置为内存中的新对象,原始对象将保持不变。然后在内存中有两个对象。 (尽管一旦方法结束,新方法将消失,因为没有人使用它。)

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



大概Socket.Receive()会执行类似于上面第二种方法的操作。它使用引用来修改对象。



为了说明ref关键字将如何改变它:

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


在这种情况下,也有副作用。任何调用该方法,然后再检查发送给该方法的对象的代码,都将看到该对象已被新对象替换。在这种情况下,内存中没有第二个“指针”指向相同的位置。该方法使用了调用代码所使用的实际指针。

关于c# - 泛型方法可以覆盖参数而无需引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33811105/

10-14 15:16
查看更多