亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

何時使用ref以及在C#中何時不需要

何時使用ref以及在C#中何時不需要

C#
開心每一天1111 2019-08-12 11:30:21
何時使用ref以及在C#中何時不需要我有一個對象是我在程序的內存狀態,還有一些其他的工作函數,我傳遞對象來修改狀態。我已經通過ref傳遞給工人函數了。但是我遇到了以下功能。byte[] received_s = new byte[2048];IPEndPoint tmpIpEndPoint = new IPEndPoint(IPAddress.Any, UdpPort_msg);EndPoint remoteEP = (tmpIpEndPoint);int sz = soUdp_msg.ReceiveFrom(received_s, ref remoteEP);它混淆了我,因為兩者received_s并remoteEP從函數返回的東西。為什么remoteEP需要一個ref而received_s不是一個?我也是程序員,所以我有一個問題,我的頭腦中有指針。編輯:看起來C#中的對象是引導下對象的指針。因此,當您將對象傳遞給函數時,您可以通過指針修改對象內容,傳遞給函數的唯一內容是指向對象的指針,因此對象本身不會被復制。如果您希望能夠在函數中切換或創建一個新對象,就像雙指針一樣,則使用ref或out。
查看完整描述

3 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

答案很長:當通過值傳遞引用類型參數時,只傳遞引用,而不是對象的副本。這就像在C或C ++中傳遞指針(按值)。調用者不會看到對參數本身值的更改,但看到參考指向的對象的更改。

通過引用傳遞參數(任何類型)時,這意味著調用者可以看到對參數的任何更改 - 對參數更改是對變量的更改。

文章更詳細地解釋了所有這些,當然:)

有用的答案:你幾乎不需要使用ref / out。它基本上是一種獲得另一個返回值的方法,通常應該被準確地避免,因為這意味著該方法可能試圖做太多。情況并非總是如此(TryParse等等是合理使用的規范示例out)但使用ref / out應該是相對罕見的。


查看完整回答
反對 回復 2019-08-12
?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

可以將非ref參數視為指針,將ref參數視為雙指針。這對我幫助最大。

您幾乎不應該通過ref傳遞值。我懷疑,如果不是互操作問題,.Net團隊永遠不會將其包含在原始規范中。處理ref參數解決的大多數問題的OO方法是:

對于多個返回值

  • 創建表示多個返回值的結構

對于作為方法調用結果在方法中更改的基元(方法對基本參數有副作用)

  • 在對象中實現方法作為實例方法,并在方法調用中操縱對象的狀態(而不是參數)

  • 使用多重返回值解決方案并將返回值合并到您的狀態

  • 創建一個包含可由方法操作的狀態的對象,并將該對象作為參數傳遞,而不是基元本身。


查看完整回答
反對 回復 2019-08-12
?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

您可以編寫一個完整的C#應用程序,并且不會通過ref傳遞任何對象/結構。

我有一位教授告訴我這件事:

您使用refs的唯一地方是:

  1. 想要傳遞一個大對象(即,對象/結構中有對象/結構到多個級別)并且復制它會很昂貴,

  2. 您正在調用Framework,Windows API或其他需要它的API。

不要因為你能做到這一點。如果您開始更改參數中的值并且沒有引起注意,您可以通過一些令人討厭的錯誤獲得幫助。

我同意他的建議,在學校開始的五年多時間里,除了調用Framework或Windows API之外,我從未需要它。


查看完整回答
反對 回復 2019-08-12
  • 3 回答
  • 0 關注
  • 1068 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號