2015-11-19 78 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++指針,並且將引用傳遞到數據將被寫入的數組是有意義的... –