7

Perl 有能力做:

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

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

4

3 回答 3

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
于 2013-07-29T13:07:26.607 回答
2

Tuple可能是一个有用的结构。

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

然后你可以这样做:

var result = Foo();

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

这是函数式编程风格对 C# 的影响越来越大的遗留问题:元组是许多函数式语言中的基本结构,并且极大地帮助了它们的静态类型。

于 2013-07-29T13:27:53.890 回答
1

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

  1. 您可以创建一个数据结构,例如 astruct或 a class,它将包含a,b,c,d并作为您的函数返回,例如data foo()data 将包含 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与 out 类似的。请参阅http://msdn.microsoft.com/en-US/library/14akc2c7(v=vs.80).aspx
  4. 或者,如果 a、b、c、d 都是相同的类型,您可以以集合的形式将它们返回为 anarrray或 a list,正如另一个成员指出的那样

另请记住,根据您传递的类型 strcut 与您重视的对象可能作为 aValue或传递Reference。请参阅http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx

于 2013-07-29T13:12:13.287 回答