2013-06-21 102 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); 

虽然它的完成你所需要的一个非常肮脏的方式。