C# を使用して参照を保存することはできません。refメソッドを呼び出すときにのみキーワードを使用できます。
ポインターを使用できますが、fixed式とunsafeコンテキスト内でのみ使用できます。
デリゲートを使用してこの種のものを偽造することは可能ですが、それがあなたが探しているものかどうかはわかりません. また、アプローチを本当に再設計する必要があることもかなり確信していますが、それにもかかわらず、それを偽造する方法の例を次に示します...
まず、「値ラッパー」クラスを次のように記述します。
public class ValueWrapper<T>
{
readonly Func<T> get;
readonly Action<T> set;
public ValueWrapper(Func<T> get, Action<T> set)
{
this.get = get;
this.set = set;
}
public T Value
{
get
{
return get();
}
set
{
set(value);
}
}
}
次に、それを使用して値を変更できます。
void run()
{
int x = 0;
var intWrapper = new ValueWrapper<int>(() => x, value => x = value);
test(intWrapper);
Console.WriteLine(x); // Prints 42, which shows that x was changed.
TextBox textBox = new TextBox {Text = ""};
var stringWrapper = new ValueWrapper<string>(() => textBox.Text, value => textBox.Text = value);
test(stringWrapper);
Console.WriteLine(textBox.Text); // Prints "Changed".
}
static void test(ValueWrapper<int> wrapper)
{
wrapper.Value = 42;
}
static void test(ValueWrapper<string> wrapper)
{
wrapper.Value = "Changed";
}
次のように、あるメソッドでラッパーを作成し、ラッパーを使用して元のラップされたオブジェクトのプロパティを変更する別のメソッドに渡すこともできます。
void run()
{
TextBox textBox = new TextBox {Text = ""};
var wrapper = test1(textBox);
test2(wrapper);
Console.WriteLine(textBox.Text); // Prints "Changed"
}
void test2(ValueWrapper<string> wrapper)
{
wrapper.Value = "Changed";
}
ValueWrapper<string> test1(TextBox textBox)
{
return new ValueWrapper<string>(() => textBox.Text, value => textBox.Text = value);
}
警告: これはかなり頭を悩ませるコードにつながります。次に例を示します。
void run()
{
var intWrapper = test();
intWrapper.Value = 42;
Console.WriteLine(intWrapper.Value); // Works, but where is the value? It can't be the x inside test()!
}
ValueWrapper<int> test()
{
int x = 0;
var intWrapper = new ValueWrapper<int>(() => x, value => x = value);
return intWrapper;
}
そのため、test() 内から明らかにローカル変数をラップしているValueWrapperfromを返しました。test()そして、明らかに値を変更して出力できます...
もちろん、これは実際に起こっていることではありませんが、かなり混乱する可能性があります。