C# 如何在一条语句中指定变量列表

C# 如何在一条语句中指定变量列表,c#,perl,C#,Perl,Perl能够做到: my ($a,$b,$c,$d) = foo(); 其中foo返回4个变量,而不是一次分配一个。C#中有类似的东西吗?基本上没有。选项: object[] values = foo(); int a = (int)values[0]; string b = (string)values[1]; // etc 或: 或: 对于函数,必须返回1个对象或void。但是你可以用几种方法来解决这个问题 您可以创建一个数据结构,如struct或class,其中将包含a、b、c、d,

Perl能够做到:

my ($a,$b,$c,$d) = foo(); 

其中
foo
返回4个变量,而不是一次分配一个。C#中有类似的东西吗?

基本上没有。选项:

object[] values = foo();
int a = (int)values[0];
string b = (string)values[1];
// etc
或:

或:


对于函数,必须返回1个对象或
void
。但是你可以用几种方法来解决这个问题

  • 您可以创建一个数据结构,如
    struct
    class
    ,其中将包含
    a、b、c、d
    ,并将其作为函数返回,例如
    data foo()
    数据将包含a、b、c、d
  • 您可以在函数的参数中使用
    out
    关键字,例如foo(out a、out b、out c、out d),但您的变量输入需要初始化。更多信息请点击这里。看
  • 您还可以使用与out类似的
    ref
    。看
  • 或者,如果a、b、c、d都是相同的类型,您可以像另一个成员指出的那样,以集合的形式返回它们,作为
    arrray
    list

  • 还请记住,根据您传递strct vs对象的类型,您的值可以作为
    参考
    传递。请参见

    元组
    可以是一个有用的构造

    public Tuple<int, string, double> Foo() { ... }
    

    这是函数式编程风格对C#的影响日益增强的结果:元组是许多函数式语言中的基本构造,在静态类型方面有很大的帮助。

    为什么不为它创建一个类呢?当然不,但正如@491243所说,您可以使用classJust interest-当这个功能有用时?当您有一个返回大量参数的函数时,它的类型就更少了,perl表示法似乎很简单,它取决于
    foo()
    返回的内容。一个方法只能有一个返回类型,但该类型可以是可枚举的,如
    列表
    或数组。如果您真的需要从一个方法返回各种变量类型,那么该方法可能做得太多了。@lazyberezovsky归根结底,所有这些都是从函数向外表达多个值的方法,并在调用方将它们分配给局部变量;其机制(列表等)是实现细节。如果要枚举错误选项,我想还可以包含一个
    元组
    :)
    。显然,C#将用户指向第二个选项-返回一个有意义的类。在我目前的职位上,当我用一个元组来解决一个类似的问题时,和我一起工作的那个家伙说他希望他以前见过它。显然,该团队创建新类的历史很长,只是为了在从方法返回数据时保存值。Ad 4。数组、列表或(最好)一个
    IEnumerable
    int a;
    string b;
    float c; // using different types to show worst case
    var d = foo(out a, out b, out c); // THIS WILL CONFUSE PEOPLE and is not a 
                                      // recommendation
    
    public Tuple<int, string, double> Foo() { ... }
    
    var result = Foo();
    
    int a = result.Item1;
    string b = result.Item2;
    double c = result.Item3;