您可以这样做,但您必须付出的代价是使用未记录的关键字/功能。它们很久以前就在那里,可能不会改变或消失,但是......
它会使您的代码阅读起来更加复杂(如果语言本身支持它可能会很有用),但它是双向的,您可以在原始对象周围移动,更改也将始终反映到您的“参考”中。它与 Mehmet Ataş 的答案不同,因为您可以将原始对象传递给另一个函数,并且更改也会传播到您的同义词。它们有限制(它们不能用于类字段),但它们适用于参数和局部变量。
您需要的是 a TypedReference
,它包含对另一个变量的引用,然后如果您为其分配一个新值,您将更改原始变量。如果有一天他们认为这是一个很好的功能,这在理论上可以为同义词打开大门。
让我们看一个例子:
var text = "initial value";
var synonym = __makeref(text);
现在synonym
是对文本的引用(请注意,它是对text
它所持有的值的引用,而不是对它的引用)。要从TypedReference
您使用的 a 中获取原始值,__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";
}