2 つのパラメーターを取り出すメソッドを作成しました。呼び出しコードで両方のパラメーターに同じ変数を渡すことができることに気付きましたが、この方法ではこれらのパラメーターを別々にする必要があります。これが真実であることを検証する最良の方法だと思う方法を思いつきましたが、それが 100% うまくいくかどうかはわかりません。これが私が思いついたコードで、質問が埋め込まれています。
private static void callTwoOuts()
{
int same = 0;
twoOuts(out same, out same);
Console.WriteLine(same); // "2"
}
private static void twoOuts(out int one, out int two)
{
unsafe
{
// Is the following line guaranteed atomic so that it will always work?
// Or could the GC move 'same' to a different address between statements?
fixed (int* oneAddr = &one, twoAddr = &two)
{
if (oneAddr == twoAddr)
{
throw new ArgumentException("one and two must be seperate variables!");
}
}
// Does this help?
GC.KeepAlive(one);
GC.KeepAlive(two);
}
one = 1;
two = 2;
// Assume more complicated code the requires one/two be seperate
}
この問題を解決する簡単な方法は、単にメソッド ローカル変数を使用し、最後に out パラメーターにコピーするだけであることはわかっていますが、これが不要になるようにアドレスを検証する簡単な方法があるかどうかに興味があります。 .