2011-03-21 68 views
1

關於約定,我有一個相當簡單的問題,何時應該實際上在C#中有ref或out參數?什麼時候應該out和ref參數在C#中使用?

這是如何適應遵循良好的面向對象,而不僅僅是懶惰或糟糕的設計?

作爲一個例子,我遇到了MembershipProvider類(來自.NET System.Web.Security),它有一個CreateUser方法,它有一個MembershipCreateStatus並返回一個MembershipUser。

背後的原因基本上是當有方法需要信息的情況下,但它不適合/不能從方法返回?

感謝

+0

可能的重複:[在.NET中ref和out參數之間的區別](http://stackoverflow.com/q/135234/102112)和[ref和out之間有什麼區別? (C#)](http://stackoverflow.com/q/516882/102112) – Alex 2011-03-21 14:08:20

+2

@Alex部分重複。這些問題要求ref和out之間的區別。這個問問他們應該用什麼。 – 2011-03-21 14:14:10

+0

是的,我瞭解他們的不同之處。這更多的是關於什麼時候應該使用它,同時仍然遵循良好的面向對象原則/ C#約定。 – kachingy123 2011-03-21 14:21:40

回答

2

只是覺得以下制度:

你有一個方法,它返回一個對象,某種狀態(甚至更多實例)。現在你有返回值2種選擇:

  1. 創建一個包裝,它封裝bool(或enum)的狀態與實際結果
  2. 獨立的n個實例

我更喜歡包裝,如果我必須返回2個以上的實例。如果簽名只處理狀態和結果,我更喜歡out/ref -style。

對於out/ref -style我喜歡例如的簽名。 TryParsebool TryParse(out T result),因爲這在使用它時給出更自然的方式,例如。爲:

int foo; 
if (int.TryParse(someString, out foo)) { 
    // do something with foo 
} 

MyState state; 
Foo fooInstance = FooCreator.Create(out state); 
if (fooInstance != null) 
* OR * 
if (state == State.Success) 

可能不是天然

1

主要使用了一個輸出參數是當你需要返回不止一兩件事。

TryParse,大量數字對象的靜態方法,例如當成功時還需要返回true/false,並且還需要返回鑄造值。

如果您需要返回多個值,某些人可能更願意返回具有多個屬性的對象/結構;它的偏好。

1

按照C#documentation for out

out關鍵字使參數被 通過引用傳遞。這與ref關鍵字的 類似,不同的是參考文獻 要求在傳遞之前初始化變量 。

因此,當您需要將值傳入方法以及從方法接收值時,請使用ref參數。當信息流僅從方法到調用者時,使用out參數。爲了完成這個故事,有一個未經修改的值參數,它將信息傳遞給方法,但不能從該方法接收信息。

我並不真正購買outref僅適用於需要從方法返回多個項目的情況。我總是更喜歡使用out從具有副作用的方法返回值。

對我來說這就是你的問題的答案。如果方法沒有副作用,並且方法的名稱是與返回值的含義匹配的名詞,則通過函數返回值從函數返回單個值。否則通過outref參數返回值。

相關問題