如何在一个语句中分配变量列表

时间:2013-07-29 13:03:26

标签: c# perl

Perl有能力:

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

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

3 个答案:

答案 0 :(得分:8)

不,基本上。选项:

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

或:

var result = foo();
// then access result.Something, result.SomethingElse etc

或:

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

答案 1 :(得分:2)

Tuple可以是一个有用的构造。

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

然后你可以这样做:

var result = Foo();

int a = result.Item1;
string b = result.Item2;
double c = result.Item3;

这是函数式编程风格对C#影响越来越大的遗留问题:元组是许多函数式语言的基本结构,并且在静态类型方面有很大的帮助。

答案 2 :(得分:1)

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

  1. 您可以创建一个包含struct的数据结构,例如classa,b,c,d,并将其作为您的函数返回,例如data foo()数据将包含a,b,c,d
  2. 您可以在功能参数中使用out关键字,例如foo(out a,out b,out c,out d),但是你的变量输入需要初始化。更多信息在这里。请参阅http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx
  3. 您也可以使用类似的ref。请参阅http://msdn.microsoft.com/en-US/library/14akc2c7(v=vs.80).aspx
  4. 或者如果a,b,c,d都是相同的类型,您可以将其作为arrraylist的集合形式返回,正如另一位成员指出的那样
  5. 另外请记住,根据您传递的strcut对象的类型,您可以将值作为ValueReference传递。见http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx