你不能在.NET中存储变量的引用。你可以存储对象的引用,但不能存储变量的引用。
原因是,如果允许存储任意变量的引用,那么就可以存储对局部变量的引用。如果可以存储对局部变量的引用,则运行时无法使用将局部变量存储在短期内存池(即堆栈)上的优化。
即使可以这样做,你所描述的操作也不是类型安全的另一个原因。你有一个名为“a”的字段变量,类型为“引用到对象变量”,以及一个名为“a”的本地变量,类型为“引用到int变量”。即使可以存储变量的引用,也没有任何意义将int变量的引用存储在类型为“引用到对象变量”的内容中,因为这两种类型在逻辑上不兼容。你可以对它们执行的操作是不同的;可以将字符串写入对象变量的引用中,但是不能将其写入int变量的引用中。
也许我误解了,但是像上面的整数变量这样的变量不会被装箱成对象,然后可以将其作为引用存储吗?
你混淆了对对象的引用和对变量的引用。我们使用相同的术语来表示实际上是两个不同的事物,这很令人困惑。
是的,装箱将值类型(如int)转换为引用类型(如object)。但这与对变量的引用没有任何关系。
当你创建对变量的引用时,你正在为该变量创建一个别名。当你说
void M(ref int y) { y = 123; }
...
int x = 0;
M(ref x);
您在说“x和y是同一个变量的两个不同名称”。
如果您想表示“我已经捕获了一个变量,并且想要能够读写它”的概念,那么请使用委托:
class Ref<T>
{
private Func<T> getter;
private Action<T> setter;
public Ref(Func<T> getter, Action<T> setter)
{
this.getter = getter;
this.setter = setter;
}
public T Value
{
get { return getter(); }
set { setter(value); }
}
}
...
int abc = 123;
var refabc = new Ref<int>(()=>abc, x=>{abc=x;});
... now you can pass around refabc, store it in a field, and so on
refabc.Value = 456;
Console.WriteLine(abc);
Console.WriteLine(refabc.Value);
明白了吗?