C# の型体系には、「値型」と「参照型」の 2 種類の型があります。
値型は値によってコピーされます。1 つをコピーすると、元のオブジェクトとは何の関係もないまったく新しいオブジェクトが得られます。
参照型は参照によってコピーされます。1 つをコピーすると、実際には、あるストレージの場所への参照がコピーされます。どちらも 1 つのオブジェクトを参照する 2 つの参照を取得します。
Shorts は値型です。
short を参照型にしたい場合は、参照型ラッパーを作成できます。
class ReferenceType<T> where T : struct
{
public T Value { get; set }
public ReferenceType(T value) { this.Value = value; }
}
var v1 = new ReferenceType<short>(1);
var v2 = new ReferenceType<short>(2);
var vs = new ReferenceType<short>[2] { v1, v2 };
v1.Value = 1024;
v2.Value = 512;
Console.WriteLine(vs[0].Value);
Console.WriteLine(vs[1].Value);
そして、そこに行きます。
これで、shortへの参照アクセスが可能になります。これは、short が実際にはクラスの value プロパティに関連付けられたフィールドに格納されているためです。次に言う場合:
v2 = new ReferenceType<short>(3);
Console.WriteLine(vs[1].Value);
「3」は得られません -- v2 は vs[1] とは異なるオブジェクトを参照するようになりました。本当にキャプチャしたいものが変数への参照である場合、使用したいのはクロージャーです。
class ReferenceToVariable<T>
{
private Func<T> getter;
private Action<T> setter;
public ReferenceToVariable(Func<T> getter, Action<T> setter)
{
this.getter = getter;
this.setter = setter;
}
public T Value { get { return getter(); } set { setter(value); } }
}
...
short v1 = 1;
short v2 = 2;
var vs = new []
{
new ReferenceToVariable<short>(()=>v1, x=>{v1=x;}),
new ReferenceToVariable<short>(()=>v2, x=>{v2=x;})
};
v1 = 123;
vs[1].Value = 456;
Console.WriteLine(vs[0].Value); // 123
Console.WriteLine(v2); // 456
ここでは、v1 と v2 の現在の値を取得および設定する方法を知っている配列オブジェクトをキャプチャします。
ここで、別の変数に直接エイリアスを作成したい場合、このオブジェクトを邪魔しない場合、C# でそれを行う方法は 1 つしかありません。
void M(ref short x)
{
x = 123;
}
...
short y = 1;
M(ref y);
現在、「x」と「y」は同じ変数の 2 つの名前です。ただし、「別の変数にエイリアスを作成する」という概念は、エイリアス変数がメソッドの仮パラメーターである場合にのみ C# で機能します。一般的には仕方がありません。
さて、理論的には、あなたが望むようなことをすることができます. 「ref locals」をサポートできます。
更新: ここで説明する「理論上の」機能は、C# 7.0 に追加されました。
short v1 = 1;
ref short rv1 = ref v1;
rv1 = 123;
Console.WriteLine(v1); // 123
つまり、rv1 は v1 のエイリアスになります。C# はこれをサポートしていませんが、CLR はサポートしているため、サポートできます。ただし、CLR は、"ref" 要素型の配列、または ref を格納するフィールドの作成をサポートしていません。そういう意味では、やりたいことができなかった。
C# は、変数への参照のように機能するオブジェクトを渡すための特別な「隠し」機能をサポートしていますが、上記の「2 つのデリゲート」参照よりも軽量です。ただし、これらの特別な機能は奇妙な相互運用シナリオ専用であり、使用しないことをお勧めします。(繰り返しになりますが、型付き参照を格納する配列を作成することはできません。) この回答では、これらの機能についてこれ以上説明することはないと思います。あなたは本当にそこに行きたくない、私を信じてください。