2013-06-21 43 views
1

我有以下方法:我如何從一個方法在C#中返回多個值

public static ?? GetType6() 
    { 
     var name = "x"; 
     var age = 1; 
     return ?? 
    } 

這樣調用:

var ?? = GetType6(); 

我希望能夠調用該方法並找回名字和年齡。我想創建一個匿名對象,但 然後,如果我這樣做,我怎麼能解碼它?

+1

一個隨時可以使用的容器或使一個類,並返回一個指向它的實例之一。 – 0x90

+0

我希望你在跳轉到代碼之前應該學習一些基礎知識。雖然不確定您的編程背景,但根據我的知識,任何應用程序編程語言都提供Classes /結構來封裝字段並交換數據,除了方法/事件等許多其他事物以修改對象的行爲/狀態(S)。 –

回答

3

最簡單的方法是返回一個Tuple<string, int>(可用自.NET 4):

public static Tuple<string, int> GetType6() 
{ 
    var name = "x"; 
    var age = 1; 
    return Tuple.Create(name, age); 
} 

您可以用這種方式讀出的值:

var pair = GetType6(); 
string name = pair.Item1; 
int age = pair.Item2; 

當然更健壯,可讀性並且可維護的是創建一個類:

class User 
{ 
    public string Name { get; set; } 
    public int Age{ get; set; } 
} 

public static User GetUser() 
{ 
    var name = "x"; 
    var age = 1; 
    return new User{Name = name, Age = age }; 
} 

var user = GetUser(); 
string name = user.Name; 
int age = user.Age; 
+5

蒂姆,你在C#中使用元組在生產?我試過了,但總是發現,創建一個自定義類使得代碼更具可讀性。你通過'Item1'和'Item2'訪問元素,這是非常模糊的。我發現了諸如F#這樣的語言的元組,在那裏你可以使用模式匹配,但它在C#中值得嗎? –

+0

@IlyaIvanov我幾乎從不公開或內部方法暴露元組;我發現使用正確命名的屬性編寫一個簡單的不可變包裝器類更具可讀性。 –

+0

@IlyaIvanov:我只將它們用於內部代碼。所以例如在私人方法的一個類中。我永遠不會將它用於由不相關的類使用的代碼。有時候你不想爲所有事情創建一個類,因爲這個類可能是多餘的或者誤導性的。所以在這種情況下,「Tuple」可能不是最好的選擇,因爲OP需要一個「公共靜態」方法。 –

0

使用out關鍵字,有可能如下:

public static string GetType6(out int age) 
{ 
    var name = "x"; 
    var age = 1; 
    return name 
} 
  • out關鍵字使參數通過引用傳遞。
  • 這與ref關鍵字類似,但ref要求變量在傳遞之前進行初始化。
  • 要使用out參數,方法定義和調用方法都必須顯式使用out關鍵字。

注意:這是不好使練習使用這個。

+3

http://stackoverflow.com/questions/2366741/what-is-bad-practice-when-using-out-parameters –

7

爲什麼不只是創建一個類型舉行任何你想要的?

public static MyType GetType6() 
{ 
    MyType type = new MyType(); 
    type.name = "x"; 
    type.age = 1; 
    return type; 
} 

class MyType 
{ 
    public string name {get;set;} 
    public int age {get;set;} 

    public MyType() 
    { 
    } 
} 
0

你可以像你說的使用匿名類型。喜歡這個。

public static object GetType6() 
{ 
    return new { name = "x", age = 1 }; 
} 

要讀取您必須使用反射的值。

var foo = GetType6(); 
var name = foo.GetType().GetProperty("name").GetValue(foo, null); 
var age = foo.GetType().GetProperty("age").GetValue(foo, null); 

雖然它的完成你所需要的一個非常骯髒的方式。