覆盖没有引用的参数的泛型方法
本文关键字:参数 泛型方法 引用 覆盖 | 更新日期: 2023-09-27 18:22:49
好吧,这可能是一个非常愚蠢的问题,但无论如何我都会拿我的代表冒险。我对编程还很陌生,所以请放轻松,好吗?)所以我刚进入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();
}
在这个场景中,还有一个副作用。任何调用该方法,然后检查发送给该方法的对象的代码都会发现该对象已被新对象替换。在这种情况下,内存中没有第二个指向同一位置的"指针"。该方法使用了调用代码使用的实际指针。