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

これまでの答え (タプルを返す、コレクションを返す、カスタム クラス/構造体を返す、またはパラメーターを使用する) は合理的な答えですが、より良い答えは、最初からそれをしないことです。4 つのものを返すメソッドは、おそらく設計が不適切なメソッドです。

たとえば、それぞれが 1 つのものを返す 4 つの異なるメソッド (またはプロパティ) を持つように型を再設計できますか? 使用するより良いパターンがあるかもしれません。あなたのシナリオをもっと詳しく説明できますか?

于 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;

したがって、タプルはある程度匿名です。

1 つまたは 2 つの追加パラメーターを返したい場合outは、メソッドのようにパラメーターを使用することもできTryParseます。

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

リーの答えに加えて、いくつかのrefまたはoutパラメーターを追加できます。つまり、次のようになります。

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

パラメータなしでこのような関数を作成することもできます。

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

簡単な答えが必要だと思いますよね?

この単純なコードを理解してみてください(コピーして貼り付けるだけです)。

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

それらをout パラメータとして返すことができます

于 2012-12-21T13:47:28.737 に答える
0

4 つのまったく異なるものを返す場合は、新しい型を作成するのが最善です。たとえば、新しく作成された形状の高さ、幅、上部、および下部の値を返す場合は、適切な変数名を持つこれらの値をすべて保持するクラスを作成する必要があります。

同じ種類のものを 4 つ持っている場合は、それらすべてを何らかのコレクションに入れるのが理にかなっています。たとえば、4 つの数値が 4 つの異なる形状の面積を表している場合は、 aList<int>またはを返すのが理にかなっていint[]ます。

于 2012-12-21T14:04:00.490 に答える