あなたはそれを行うことができますが、支払わなければならない代償は、文書化されていないキーワード/機能を使用することです. ずっと昔からあるもので、おそらく変わらない、消えることはないだろうけど…
コードが読みにくくなります (言語自体でサポートされている場合は便利かもしれません) が、双方向であり、元のオブジェクトを移動できます。変更は常に「参照」にも反映されます。元のオブジェクトを別の関数に渡すことができ、変更がシノニムにも伝播するため、Mehmet Ataş の回答とは異なります。これらには制限があります (クラス フィールドには使用できません) が、パラメーターとローカル変数には機能します。
必要なのは です。別の変数への参照TypedReference
を保持し、新しい値を割り当てると、元の変数が変更されます。理論的には、これが含まれるのに適した機能であると彼らが考えるようになると、同義語への扉が開かれる可能性があります。
例を見てみましょう:
var text = "initial value";
var synonym = __makeref(text);
synonym
これはテキストへの参照です (保持する値への参照ではなく、参照であることに注意してください) text
。a から元の値を取得するには、次のようTypedReference
に使用します__refvalue
。
Console.WriteLine(__refvalue(synonym, string));
それらは同じ値を持っています:
Debug.Assert(__refvalue(synonym, string) == text);
テキストを新しい値に変更しましょう。
text = "second value";
Debug.Assert(__refvalue(synonym, string) == text);
そしてその逆も真です:
__refvalue(synonym, string) = "third value"; // <---
Debug.Assert(__refvalue(synonym, string) == text);
最後に、別の関数内で元の変数を変更しましょう (通常の変数が表示される参照を認識していません)。
void ChangeIt(ref string value) { value = "another value"; }
ChangeIt(ref text);
Debug.Assert(__refvalue(synonym, string) == text);
このすべての作業は、同様に型を評価します。これにより、エイリアスではなく、変数の同義語が作成されることに注意してください(参照型の場合は、安全なポインター-ポインターへのポインターとして想像できます)。これを試してみましょう:
void foo1()
{
string text = "ABC";
foo2(text);
// text holds the original value "ABC"
// not the value modified in foo2
}
void foo2(string value)
{
value = "123";
var synonym = __makeref(value);
__refvalue(value, string) = "456";
// both value and synonym holds "456";
}