我正在编写一个"监视器"对象,以方便我的应用程序的调试.可以在运行时从IronPython解释器访问此Monitor对象.我的问题是,在C#中是否可以存储对值类型的引用?说我有以下课程:
class Test
{
public int a;
}
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式存储"指针"到"a",以便能够随时检查它的价值吗?是否可以使用安全和托管代码?
谢谢.
Eri*_*ert 54
您不能在字段或数组中存储对变量的引用.CLR要求对变量的引用在(1)形式参数中,(2)本地,或(3)方法的返回类型.C#支持(1)但不支持其他两个.
(旁白:这是有可能的C#支持其他两个,事实上我写了一个原型编译器确实实现这些功能这是相当整洁(见.http://ericlippert.com/2011/06/23/ref- return-and-ref-locals / for details.)当然,必须编写一个算法来验证没有ref本地可能引用现在被破坏的堆栈帧上的本地,这有点棘手,但是也许我们会在假设的未来版本的语言中支持这一点.(更新:它被添加到C#7!))
但是,通过将变量放在字段或数组中,可以使变量具有任意长的生命周期.如果您需要的是"我需要将别名存储到任意变量"的"参考",那么,不.但是,如果您需要的是"我需要一个允许我读写特定变量的魔术令牌"的参考,那么只需使用一个委托或一对委托.
sealed 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); }
}
}
...
Ref<string> M()
{
string x = "hello";
Ref<string> rx = new Ref<string>(()=>x, v=>{x=v;});
rx.Value = "goodbye";
Console.WriteLine(x); // goodbye
return rx;
}
Run Code Online (Sandbox Code Playgroud)
外部局部变量x将保持活着至少直到rx被回收.
否 - 您无法直接在C#中存储值类型的"指针".
通常,您将持有对包含"a"的Test实例的引用 - 这使您可以访问a(via testInstance.a).