2015-11-19 34 views
2

好吧,这可能是一个非常愚蠢的问题,但我会冒任何代价的风险。我对编程相当陌生,所以放轻松会雅;) 所以我刚刚进入TCP,当我遇到一些我不明白的东西。 具体而言:覆盖无参考参数的通用方法?

int length = Socket.Receive(MyByteArray); 

我的理解此方法返回数据的长度beeing接收所述收到的数据写入到我的字节数组。那么如何在我没有告诉它的情况下写入我的字节数组?经过一番研究,我了解到你可以使用引用来做这种事情,但这种方法不需要“引用MyByteArray”,这让我感到困惑。这是一种不同的方法,还是它在方法内部发生了什么?

在此先感谢您完全真棒的人。

+5

对引用类型和值类型进行一些研究。数组是引用类型,所以当你将一个函数传递给一个函数时,它具有对实际对象的_reference_并可以改变它的属性。 –

+0

你正在通过传入你的字节数组来将它写入你的字节数组。 –

+0

没有解释_why_,它很容易验证你自己_that_它的工作原理:http://ideone.com/HrLDZ3 – CompuChip

回答

3

引用类型传递给方法有时对开发人员而言可能是不直观的。考虑这两个代码段(均未使用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(); 
} 

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

+0

为了清楚起见,当你修改原始对象时,为什么不使用ref? – ThatBrianDude

+1

@TBBrianDude:我想你*可以*。说实话,像'Socket.Receive()'这样的方法在这方面让我感到困扰。我个人发现它*意想不到的东西,我传递给要修改的方法。遵循最少量的原则和什么。对于框架中发生这种情况的任何给定方法,我怀疑它是从哪里来的,它为什么会这样做,现在它是什么,它们不能引入突变。但是,我们今天写的任何东西都不应该像这样修改对象。 – David

+0

@大卫你必须了解数组起源的地方,它从'class Array'继承。这就是说,一个类将通过引用传递;)。考虑这是一个C++指针,并且将引用传递到数据将被写入的数组是有意义的... –