11

実際のアプリで「ref」(引数を参照で渡す) の使用方法に苦労しています。シンプルで主に意味のある例が欲しいです。これまでに見つけたものはすべて、戻り値の型をメソッドに追加することで簡単にやり直すことができました。誰かアイデアはありますか?ありがとう!

4

6 に答える 6

21

私の頭に浮かぶ最良の例は、2 つの変数の値を交換する関数です。

static void Swap<T>(ref T el1, ref T el2)
{
    var mem = el1;
    el1 = el2;
    el2 = mem;
}

使用法:

static void Main(string[] args)
{
    string a = "Hello";
    string b = "Hi";

    Swap(ref a, ref b);
    // now a = "Hi" b = "Hello"

    // it works also with array values:
    int[] arr = new[] { 1, 2, 3 };
    Swap(ref arr[0], ref arr[2]);
    // now arr = {3,2,1}
}

refこのような機能は、キーワードなしでは実行できません。

于 2011-01-10T11:17:10.220 に答える
5

おそらくコーナーケースの例の1つ:Interlocked.Increment。参照によって変数を渡さなければ、アトミックにインクリメントを実行する方法はありません。

正直に言うと、私は自分自身をあまり使用したとは言えません。私は通常ref、複数の値を返す必要性を避け、それでも通常は十分です。私が使用したケースの多くは、参照型に関して.NETで引数がどのように渡されるかを作成者が理解していないことが原因ですout ref

于 2011-01-10T11:14:23.550 に答える
4

TryParseフレームワークに組み込まれているメソッドは典型的な例です。それらはout代わりに使用しますがref、それは同じセマンティクスです。呼び出し元が値を初期化する必要がないというだけです。例:

int result;
bool isSuccess = int.TryParse("some string", out result);
if (isSuccess)
{
    // use the result here
}

ご覧のとおり、関数は操作が成功したかどうかを示すブール値を返しますが、実際の結果はoutパラメーターとして返されます。

于 2011-01-10T11:10:08.287 に答える
1
public static void Main(string args[])
{
    int i=0;
    AddSomething(ref i);
    AddSomething(ref i);
    AddSomething(ref i);
    AddSomething(ref i);


    string mystr = "Hello";
    AddSomeText(ref mystr);
    Console.WriteLine(mystr);


    Console.WriteLine("i = {0}", i);
}


public static void AddSomeText(ref string str)
{
    str+= " World!";
}


public static void AddSomething(ref int ii)
{
    ii+=1;
}
于 2011-01-10T11:11:33.653 に答える
0

トランポリンがいい例だと思います。

ここでは、再帰関数を取得して、一連の値に対して繰り返し呼び出されるメソッドに作り直します。その理由は、スタックに非常に深く入る代わりに、自分自身を呼び出すのではなく、すべての呼び出しの後に戻るため、スタックがフラットのままであるためです。

よろしくGJ

于 2011-01-10T11:23:10.753 に答える
0

私が目にする最も一般的な場所の 1 つは、いくつかのフレームワークの Save メソッドにあります。

その理由は、多くの場合、オブジェクトが別のマシンにシリアル化されてから新しいインスタンスとして返される場合 (おそらくいくつかの追加のデフォルトを使用して)、save 呼び出しで同じオブジェクトを維持することは実際には不可能だからです。その場合、元の参照が無効であることを明確にするために参照が必要です。

その必要性については、それが必要になる例を思いつくことはできません。ほとんどの場所は問題ありません。

于 2011-01-10T11:14:43.337 に答える