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

时间:2015-11-19 17:59:18

标签: c# ref

好吧这可能是一个非常愚蠢的问题,但无论如何我都会冒险。我对编程很陌生,所以请放轻松吧。 所以当我遇到一些我不太了解的东西时,我刚刚进入TCP。 具体来说:

int length = Socket.Receive(MyByteArray);

据我所知,此方法返回收到的数据的长度将收到的数据写入我的字节数组。那么如果没有我告诉它,它如何写入我的字节数组?经过一些研究,我了解到你可以使用引用来做这种事情,但这种方法并不需要" ref MyByteArray"这让我感到困惑。这是一种不同的方法,还是方法内部的内容(duh)?

先谢谢你,真是太棒了。

1 个答案:

答案 0 :(得分:3)

引用类型传递给方法有时对开发人员来说可能是不直观的。考虑这两段代码(两者都不使用$this关键字):

ref

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

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

据推测,void Method1(SomeType myObj) { myObj = new SomeType(); } void Method2(SomeType myObj) { myObj.SomeProperty = 1; } 做的事与上面的第二种方法类似。它使用引用来修改对象。

说明Socket.Receive()关键字如何更改此内容:

ref

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

相关问题