2016-06-20 49 views
1

我需要從方法返回2個值(一個字符串和一個點),我真的不想使用ref/out作爲值應該保持在一起。使用詞典只有一個條目

我正在考慮使用Dictionary<string, Point>

我的問題是:字典是數據結構的好選擇,如果它只有一個KeyValuePair?或者還有其他合適的選擇嗎?

+3

可能是一個'KeyValuePair <,>'更好 –

+7

類很便宜,只需一個就可以容納數據。 –

+0

解釋爲什麼在[返回多個值]中建議'Tuple'(http://stackoverflow.com/questions/748062/how-can-i-return-multiple-values-from-a-function-in-c)沒有在你的情況下工作會使這個問題更好(並證明你研究了現有的選項)。 –

回答

3

您可以創建自己的類。但Tuple<T1, T2>可能會很方便。只是這樣的事情,當你需要傳遞一個包含幾種不同類型的對象時。

我會傾向於創建一個類,除非它非常清楚什麼元組僅用於定義。這樣你就可以給它一個提高可讀性的名字。如果您以後確定有兩個以上的值,它還可以節省維護滋擾。您可以保留一個班級,而不是在多個地方用Tuple<int, Point, Something>代替Tuple<int, Point>

我不會使用KeyValuePair,因爲有人看着它會合理地認爲圖片中有字典,所以會造成一些混淆。如果只有兩個值並且沒有字典,那麼就沒有密鑰。

4

如果你不想創建一個名爲類,你可以使用元組返回多個參數

Tuple<int, Point> tuple = 
     new Tuple<int, Point>(1, new Point()); 

return tuple 
+2

或'返回Tuple.Create(1,new Point());' – knittl

+0

關於元組的唯一壞處是調用者必須以'Item1'和'Item2'的方式訪問值。這是不可讀的。 – niksofteng

2

我會使用一個類或結構來存儲這兩個值。我更喜歡它來維護代碼,並允許您在將來擴展系統。

public class MyData { 
    public string MyString {get;set;} 
    public Point MyPoint {get;set;} 
} 

public class Storage { 
    public MyData retrieveMyData() { 
     MyData data = new MyData(); 
     return data; 
    } 
} 
1

每當你看到這個,你應該停下來想一想「這是否應該是一個對象? 如果這是一次性的,你可以使用Tuple,但大多數時候你會想到再次使用相同參數的情況。到那時,你會希望你第一次創建了一個對象。

通過爲一組參數創建一個對象,您可以給它一個名稱,以提高可讀性。如果將參數封裝到對象的屬性中,則還可以創建getter和setter方法,這樣可以進一步控制對它們的訪問,並在將來需要時添加更多功能。

最重要的是可讀性。我可以稱之爲NamedPoint,它告訴任何人閱讀我的代碼,爲什麼我已經將字符串和點組合在一起。如果我希望它具有一定的長度或者不以數字或任何數量的其他事物開始,我可以稍後爲該名稱添加驗證。

相關問題