3 回答

TA貢獻1851條經(jīng)驗 獲得超3個贊
答案很長:當(dāng)通過值傳遞引用類型參數(shù)時,只傳遞引用,而不是對象的副本。這就像在C或C ++中傳遞指針(按值)。調(diào)用者不會看到對參數(shù)本身值的更改,但會看到參考指向的對象的更改。
當(dāng)通過引用傳遞參數(shù)(任何類型)時,這意味著調(diào)用者可以看到對參數(shù)的任何更改 - 對參數(shù)的更改是對變量的更改。
文章更詳細地解釋了所有這些,當(dāng)然:)
有用的答案:你幾乎不需要使用ref / out。它基本上是一種獲得另一個返回值的方法,通常應(yīng)該被準確地避免,因為這意味著該方法可能試圖做太多。情況并非總是如此(TryParse
等等是合理使用的規(guī)范示例out
)但使用ref / out應(yīng)該是相對罕見的。

TA貢獻1836條經(jīng)驗 獲得超4個贊
可以將非ref參數(shù)視為指針,將ref參數(shù)視為雙指針。這對我?guī)椭畲蟆?/p>
您幾乎不應(yīng)該通過ref傳遞值。我懷疑,如果不是互操作問題,.Net團隊永遠不會將其包含在原始規(guī)范中。處理ref參數(shù)解決的大多數(shù)問題的OO方法是:
對于多個返回值
創(chuàng)建表示多個返回值的結(jié)構(gòu)
對于作為方法調(diào)用結(jié)果在方法中更改的基元(方法對基本參數(shù)有副作用)
在對象中實現(xiàn)方法作為實例方法,并在方法調(diào)用中操縱對象的狀態(tài)(而不是參數(shù))
使用多重返回值解決方案并將返回值合并到您的狀態(tài)
創(chuàng)建一個包含可由方法操作的狀態(tài)的對象,并將該對象作為參數(shù)傳遞,而不是基元本身。

TA貢獻1856條經(jīng)驗 獲得超11個贊
您可以編寫一個完整的C#應(yīng)用程序,并且不會通過ref傳遞任何對象/結(jié)構(gòu)。
我有一位教授告訴我這件事:
您使用refs的唯一地方是:
想要傳遞一個大對象(即,對象/結(jié)構(gòu)中有對象/結(jié)構(gòu)到多個級別)并且復(fù)制它會很昂貴,
您正在調(diào)用Framework,Windows API或其他需要它的API。
不要因為你能做到這一點。如果您開始更改參數(shù)中的值并且沒有引起注意,您可以通過一些令人討厭的錯誤獲得幫助。
我同意他的建議,在學(xué)校開始的五年多時間里,除了調(diào)用Framework或Windows API之外,我從未需要它。
- 3 回答
- 0 關(guān)注
- 1064 瀏覽
添加回答
舉報