2

假设在 C# 类中有一个方法_Abc(int a, int b),通常它需要 2 个参数。

是否可以从_Abc(int a, int b)方法中获取 4 个 int 值作为返回值?

4

9 回答 9

10

你可以返回一个Tuple<int, int, int, int>. 但是,将元组作为公共 API 的一部分返回并不能提供很多信息,因此在这种情况下,我将创建一个类来保存返回值,以便您可以命名这些值。

于 2012-12-21T13:44:59.947 回答
9

尽管到目前为止的答案(返回元组、返回集合、返回自定义类/结构或使用 out 参数)是合理的答案,但更好的答案是:首先不要这样做。返回四个东西的方法可能是一个设计糟糕的方法。

你能重新设计类型,让你有,比如说,四种不同的方法(或属性),每一种都返回一个东西吗?可能有更好的模式供您使用。你能更详细地解释你的场景吗?

于 2012-12-21T15:41:53.860 回答
6

您可以返回自定义类型,这是最灵活和可扩展的方法。

public static Foo GetFoo(int a, int b)
{
    Foo foo = new Foo();
    foo.A = 1;
    foo.B = 2;
    foo.C = 3;
    foo.D = 4;
    return foo;
}

这是伪类

public class Foo
{
    public int A{ get; set; }
    public int B{ get; set; }
    public int C{ get; set; }
    public int D{ get; set; }
}

另一种方法(使用 .NET 4)是使用Tuple

public static Tuple<int,int,int,int> GetFoo(int a, int b)
{
    return Tuple.Create(1,2,3,4);
}

由于您以这种方式阅读属性,因此它不像类方法那样可读:

var values = GetFoo(1, 2);
int A = values.Item1;
int B = values.Item2;
int C = values.Item3;
int D = values.Item4;

所以一个元组有点匿名。

如果您只想返回一个或两个附加参数,您也可以outTryParse方法中使用参数。

DateTime dt;
String str = "01.01.2013";
if(DateTime.TryParse(str, out dt))
{
    // so this method returns two variables:
    // a bool as return value and a DateTime as out parameter
    Console.WriteLine("Year: " + dt.Year);
}
于 2012-12-21T13:47:11.313 回答
2

除了李的回答,你可以添加一些refout参数,即:

_Abc(int a, int b, out int c, out int d, out int e, out int f)
于 2012-12-21T13:46:22.427 回答
1

您也可以使用 out 参数创建这样的函数。

public void _Abc(int a, int b, out res1, out res2, out res3, out res4)
   {
    res1 = 1;
    res2 = 2;
    res3 = 3;
    res4 = 4;
   }
于 2012-12-21T13:48:56.253 回答
1

如果可以更改方法,则可以使用 out 参数。http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

_Abc(int a, int b, out int c, out int d, out int e, out int f){
c=1;
d=2;
e=3;
f=4;
}
于 2012-12-21T13:58:40.910 回答
0

如果您要返回 4 个完全不同的东西,那么最好创建一个新类型。例如,如果您要返回一个新创建的形状的高度、宽度、顶部和底部值,那么您应该创建一个类,以使用正确的变量名称保存所有这些值。

如果您持有 4 个相同类型的东西,那么将它们全部放入某种集合中可能是有意义的。例如,如果四个数字代表四种不同形状的面积,那么返回 aList<int>或 an 是有意义的int[]

于 2012-12-21T14:04:00.490 回答
0

我认为您需要简单的答案,对吗?

尝试理解这个简单的代码(只需复制和粘贴):

class Class1
{
    private List<int> _Abc(int a, int b)
    {
        // do job

        int x = 128, y = 256, z = 512;
        List<int> returns = new List<int>();
        returns.Add(x);
        returns.Add(y);
        returns.Add(z);

        return returns;
    }

    public void anotherMethod()
    {
        List<int> simple = new List<int>();
        simple = _Abc(55, 56);

        int[] _simple = simple.ToArray();
        for (int i = 0; i < simple.Count; i++)
        {
            Console.WriteLine("" + _simple[i]);
        }
        //Console.ReadKey();
    }
}
于 2012-12-21T14:12:15.947 回答
0

您可以将它们作为输出参数返回

于 2012-12-21T13:47:28.737 回答