我鄙視出來的和裁判的作爲方法參數。恕我直言,他們使代碼不那麼幹淨,並提供副作用的機會。但我承認我可能不瞭解他們的用處,這可能解釋我的一部分厭惡。請問,有人可以解釋一個有效的情況出來或參考?在方法中使用「out」或「ref」參數的正當理由是什麼?
回答
基本上,如果你需要返回多個值,它是使用類似Tuple<,>
或自定義類型封裝值的替代品。規範示例可能是int.TryParse
及相關方法。他們想要傳達兩個信息回:
- 分析得到的值
- 無論解析成功。
現在,這些可能實際上已經在這種情況下使用的int?
等返回類型編寫的,但它是其他情況相同的原則。 (例如,Dictionary<,>.TryGetValue
,其中存儲在字典中的值可以合法地爲空)。
我不會說我鄙視out
和ref
參數,但我相信他們應該只偶爾使用,並且只當沒有更好的選擇。我在堆棧溢出中看到的大多數ref
的用法都是由於誤解了參數傳遞。
'ref'用法的好例子是什麼? –
@SaeedAmiri:大致相同,但您希望變量也可用作輸入。這有點像有一個「in」參數和另一個「out」參數,除了調用者不能分開這兩個參數:) –
對不起一個問題,爲什麼.net團隊決定在tryparse中使用'out'而不是'ref'? –
out
提供了一種方法返回多個值。 ref
是相同的,但您可以也傳中的值。
注意,您可以發生變異,即使沒有ref
聲明的對象(假設它是在第一時間當然是可變的)。
我寧願out
另一種方法是使一個類來包含所有返回值,並返回類的一個實例。
不止一個,而不僅僅是兩個。 –
「out」參數肯定會爲副作用提供機會 - 它們要求該方法要麼永遠運行,要麼異常終止,要麼變異變量*。這是一個副作用。 –
它們幾乎相同 - 唯一的區別是您作爲out
參數傳遞的變量不需要初始化,並且使用參數out
的方法必須將其設置爲某個值。
int x;
Foo(out x);
int y;
Foo(ref y);
Ref
參數是可能被修改的數據,out
參數是這對功能的額外輸出已經在使用的東西的返回值數據(例如int.TryParse
)。
這是真的嗎?參考文獻未初始化時會得到什麼錯誤? –
另外OP要求在.net中使用它(通過知道可用的替代方法)而不是它們的區別, –
@AshBurlaczenko:它當然是真的,如果你想知道你得到了什麼錯誤,請啓動編譯器並找出。 –
「新」(C#4.0)lock
使用ref
(技術上lock
語句是新的Monitor.Enter過載的語法糖)。這是不可能做到這一點,而不:-)
bool acquiredLock = false;
try
{
Monitor.Enter(lockObject, ref acquiredLock);
// Code that accesses resources that are protected by the lock.
}
finally
{
if (acquiredLock)
{
Monitor.Exit(lockObject);
}
}
所以在非常關鍵的地方ref
空間。
爲什麼簡單地返回一個布爾值是不夠的原因是一個例外可以在Monitor.Enter
的return true
和bool acquiredLock =
之間的一個問題:「離開你的程序鎖tacken發生?「ref
參數解決了這個問題
+1我正在尋找好的參考樣本 –
但是,爲什麼不'var acquiredLock = Monitor.Enter(lockObject)'?儘管使用了'ref',我拒絕這是'*好需要*'。可以說標準的'Dictionary.TryGetValue'是一個更好的例子,因爲它有兩個必須返回的值(key found和value)。 – 2011-10-15 20:14:50
@pst:再次閱讀最後一段。您不能*返回*鎖是否被採用,因爲當返回值被放到「堆棧」和返回值被複制到變量中時,*之間可能會有一個異常*。 –
- 1. 不能在匿名方法中使用ref或out參數
- 2. 從匿名方法調用ref或out參數的方法
- 3. 什麼時候應該out和ref參數在C#中使用?
- 4. 爲什麼我需要用out或ref前綴參數?
- 5. 表達式樹:調用一個方法與out或ref參數
- 6. 不能在lambda表達式中使用ref或out參數
- 7. C#不能在一個匿名方法體內使用ref或out參數
- 8. 在分機中使用「ref」或「out」
- 9. Out和Ref參數與FakeItEasy
- 10. 在遞歸函數中使用Ref/Out作爲參數
- 11. 元組對與REF/out參數的方法的異步版本
- 12. 在什麼情況下'out'參數有用(其中'ref'不能用來代替)?
- 13. 在html中使用多個ref值的正確方法是什麼?
- 14. 當TryXxxx方法返回false時,out參數的標準行爲是什麼?
- 15. Vala中「ref」和「out」關鍵字的用途是什麼?
- 16. C#:如果正在傳遞一個對象變量,是否使用ref/out來創建方法參數?
- 17. 傳遞由ref和out
- 18. 爲什麼必須使用「out」而不是ref?
- 19. 爲什麼字段可以用作out/ref參數而不是屬性?
- 20. 爲什麼在匿名方法中不允許out參數?
- 21. 在Doxygen中引用參數的正確方法是什麼?
- 22. 使用「ref」和/或「out」對象類型
- 23. PL/SQL中的IN,OUT,IN OUT參數到底是什麼
- 24. 處理可選方法參數的常用方法是什麼?
- 25. 使用可選參數處理函數重載的正確方法是什麼?
- 26. 當使用const std :: string&作爲方法參數類型時,處理nullptr const char *的正確方法是什麼?
- 27. 什麼是在ref中彈出PersistentQueue的慣用方法?
- 28. 在指針參數上使用ref和out關鍵字
- 29. ref和out有什麼區別?
- 30. 爲什麼'ref'和'out'支持多態?
你在問這兩者之間的區別,或者一般使用它們的目的是什麼?爲什麼這個標記爲java? – Marlon
你認爲他們如何提供機會對於副作用? – svick
http://stackoverflow.com/questions/635915/when-to-use-ref-and-when-it-is-not-necessary-in-c-sharp –