【发布时间】:2015-04-26 20:28:04
【问题描述】:
是否可以创建一个对象来注册当前线程是否离开创建它的方法,或者在实例上的方法被调用时检查是否发生了这种情况?
ScopeValid obj;
void Method1()
{
obj = new ScopeValid();
obj.Something();
}
void Method2()
{
Method1();
obj.Something(); //Exception
}
这种技术可以实现吗?我想开发一个类似于TypedReference 和ArgIterator 的机制,它不能“逃避”当前的方法。这些类型是由编译器专门处理的,所以我不能完全模仿这种行为,但我希望至少可以创建一个具有相同结果的类似规则 - 如果对象已经转义了它所在的方法,则不允许访问该对象已创建。
请注意,我不能使用StackFrame 和比较方法,因为对象可能会转义并返回到相同的方法。
【问题讨论】:
-
您的用例是什么?在您的示例中,似乎
obj是Method1()的本地对象会更好地表达意图 -
使用
ScopeValid的代码是用户创建的。即使我说不能这样做,一些讨厌的程序员可能会破坏它,所以我想知道它是否可以强制执行。 -
好的,但是使其他方法可以引用和尝试使用的方法范围成员的用例是什么?
-
@jdphenix 我不明白。
ArgIterator不能在方法外部使用,因为它访问传递给方法的参数,这些参数只存在于方法内部。ScopeValid会做类似的事情,所以类似的强制措施会派上用场。 -
你为什么要实现这个? - 我想这已经很清楚了。