サーチ…


備考

これにはC#に固有の答えはありません - いわゆる必要です。それにもかかわらず、このニーズを満たすための回避策があります。

私が "いわゆる"という必要性を認める理由は、良いプログラミングの原則に違反したときに戻るためには、2つ以上の値を持つメソッドしか必要ないということです。特に単一責任の原則

したがって、2つ以上の値を返す関数が必要なときに警告を受けて、設計を改善する方が良いでしょう。

「匿名オブジェクト」+「動的キーワード」ソリューション

関数から匿名オブジェクトを返すことができます

public static object FunctionWithUnknowReturnValues ()
{
    /// anonymous object
    return new { a = 1, b = 2 };
}

結果を動的オブジェクトに割り当て、その中の値を読み込みます。

/// dynamic object
dynamic x = FunctionWithUnknowReturnValues();

Console.WriteLine(x.a);
Console.WriteLine(x.b);

タプル解

Tuple<string, MyClass> 2つのテンプレートパラメータを使用して、関数からTupleクラスのインスタンスを返すことができます。

public Tuple<string, MyClass> FunctionWith2ReturnValues ()
{
    return Tuple.Create("abc", new MyClass());
}

そして、以下のような値を読んでください:

Console.WriteLine(x.Item1);
Console.WriteLine(x.Item2);

参照パラメータと出力パラメータ

refキーワードは、 Argument as Referenceを渡すために使用されます。 outrefと同じように動作しますが、関数を呼び出す前に呼び出し元によって割り当てられた値を必要としません。

Ref Parameter : - refパラメータとして変数を渡す場合は、refパラメータとしてメソッドに渡す前に初期化する必要があります。

Out Parameter:変数をoutパラメータとして渡す場合は、outパラメータをoutに渡す前に初期化する必要はありません。

static void Main(string[] args)
{
    int a = 2;
    int b = 3;
    int add = 0;
    int mult= 0;
    AddOrMult(a, b, ref add, ref mult); //AddOrMult(a, b, out add, out mult);
    Console.WriteLine(add); //5
    Console.WriteLine(mult); //6
}

private static void AddOrMult(int a, int b, ref int add, ref int mult) //AddOrMult(int a, int b, out int add, out int mult)
{
    add = a + b;
    mult = a * b;
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow