作者aMaa (aMa)
看板Visual_Basic
標題[.NET] 物件類別的ByVal及ByRef問題
時間Wed Dec 30 16:24:25 2009
大家好! 我有個觀念上的問題,有關ByVal,ByRef
我的問題以星號標示:
ByVal:呼叫程序的實引數會複製一份給被呼叫的虛引數,因此實引數與虛引數二者
佔用不同記憶體位址,當二者其一被修改時並不會互相影響值。
ByRef:實引數與虛引數佔用相同記憶體位址,因此虛引數一改變,對應的實引數也改變。
☆1.如上的說法,是不是代表ByVal是複製的功能,將內容複製一份給不同變數?
那如果我自已寫一個類別,其中有屬性及方法,
當我將類別new出物件後,以ByVal方式傳給另一程序的虛引數,是不是代表物件的"複製"?
會這樣問,是因為最近我需要將自已寫的類別物件"複製"給其他類別變數,
需內容相同,但彼此獨立,亦即佔用不同記憶體,這意味著是不是可以用ByVal來傳?
另外,在書上說:
如果實引數是陣列的話,不管是寫ByVal,.net都會當ByRef來傳,
因為陣列名稱所存的即是此陣列的起始位址,因此使用整個陣列當引數傳遞即視為參考
呼叫(ByRef)
☆2.那麼類別物件是不是也有這樣的限制,不管是寫ByVal,如同傳遞陣列一樣,
.NET只能以ByRef來傳?
☆3.如果類別物件不能以ByVal來複製,那麼類別物件的複製(深層複製)如何做到?
註:類別物件的複製:類別物件內容相同,但佔用不同記憶體,為個別獨立物件
☆4.如果類別物件可以用ByVal來複製,那麼ByVal的功能是不是等於clone()
☆5.類別物件的複製還有哪些方式可以做到?
再請大家解惑,謝謝!
※ 編輯: aMaa 來自: 140.96.98.77 (12/30 16:28)
推 fumizuki:物件類別必須自行實作Clone的功能 12/30 20:28
推 fumizuki:假使System.Array沒有提供Clone方法,也是必須自行實作 12/30 20:32
推 horngsh:基本上在C#還是VB.NET, CLASS當成參數的傳遞都是ByRef, 除 12/30 21:22
→ horngsh:非您的類別有實作IClonable介面, 才可以用ByVal 12/30 21:23