次のようなことは可能ですか?
string A = "A";
string B = "B";
object[] O = { A, B };
O[0] = "C";
最終的に値はどこA
に保持"C"
されますか?
上記のコードは に置き換えO[0]
られます"C"
が、A
変更はありません。
いいえ - 少なくとも安全なコードではありません。
配列を作成すると、値が配列にコピーされます。後で配列の値を変更しても、変数の値は変更されません。配列要素が変数と共有される、一種の「参照配列」を作成する方法はありません。(マークの回答に示されているように、安全でないコードでこれを行う方法がある場合がありますが、それを避けることをお勧めします。)
ただし、配列と変数の両方が同じ変更可能なオブジェクトを参照している場合、いずれかのパスを介してそのオブジェクトを変更すると、もう一方のパスを介して表示される変更が行われることに注意してください。
StringBuilder x = new StringBuilder();
StringBuilder[] array = new StringBuilder[] { x };
array[0].Append("Foo");
Console.WriteLine(x); // Prints "Foo"
ただし、これは他の代入と同じです。上記のコードでは、呼び出しによってどちらの配列要素Append
の値も変更されないことに注意してください。x
これらの値が参照するオブジェクト内のデータを変更します。
文字列の場合、答えはノーですが、値型を使用してこれを行うことができます。
class Program
{
static unsafe void Main()
{
char A = 'A';
char B = 'B';
var O = new char*[] { &A, &B };
*O[0] = 'C';
System.Console.WriteLine(A + "," + B); // outputs C,B
}
}
安全でないコードは通常、C#では眉をひそめます。ですから、このようなことは可能ですが、私はそれを行うことをお勧めしません。