你可以做到這一點,但你必須付出的代價是使用無證關鍵字/功能。他們從很久以前在那裏,也許他們不會改變或消失,但...
它會讓你的代碼更復雜的閱讀(如果語言本身支持的可能是有用的),但它是雙向的並且您可以圍繞原始對象移動,更改將始終反映到您的「參考」中。它不同於穆罕默德阿塔斯的答案,因爲你可以將原始對象傳遞給另一個函數和更改將傳播到您的同義詞。它們有侷限性(它們不能用於類字段),但它們適用於參數和局部變量。
你需要的是一個TypedReference
,它擁有一個參考到另一個變量,那麼如果你給它分配一個新的值,你會改變原來的變量。理論上這可以打開同義詞的大門,如果有一天他們會認爲這是一個很好的特徵。
讓我們看一個例子:
var text = "initial value";
var synonym = __makeref(text);
現在synonym
是文字的引用(請注意這是到text
參考,不將其持有的價值)。要獲得從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";
}
你爲什麼要這麼做? – ctn
你通常在C#中有引用,所以我不確定你的意思。 – Skurmedel
@Skurmedel不是我的例子,數組清除了事情? – Serge