是否可以创建一个对象来注册当前线程是否离开创建它的方法,还是检查实例上的方法被调用时是否发生了这种情况?
ScopeValid obj;
void Method1()
{
obj = new ScopeValid();
obj.Something();
}
void Method2()
{
Method1();
obj.Something(); //Exception
}
这项技术可以实现吗?我想开发一种类似于TypedReference
和ArgIterator
的机制,它不能“逃避”当前的方法。这些类型是由编译器专门处理的,所以我无法完全模仿这种行为,但我希望至少可以创建具有相同结果的类似规则 - 如果它已经转义了它的方法,则禁止访问该对象创建
请注意,我无法使用StackFrame
和比较方法,因为对象可能会转义并返回相同的方法。
答案 0 :(得分:7)
根据调用源更改方法行为是一个糟糕的设计选择。
使用这种方法需要考虑的一些示例问题包括:
如果你的代码的用户破坏了它,并且它是他们的错,让它破裂。最好只用以下内容记录你的代码:
IInvalidatable
- 完成此操作后,实现此成员的类型应使Invalidate()
失效。
如果你的代码的用户没有&#,那么忽略这个几乎就像的明显点是重新发明IDisposible
和using { }
块(有语言支持) 39;使用得当,它并不是你真正关心的问题。
这在技术上可能与AOP(我在这里思考PostSharp)有关,但它仍然取决于用户正确使用您的代码 - 他们必须在构建过程中使用它,并且如果他们不能运行我们之所以没有使用工具,只是因为你试图让它们变得容易,就是邪恶的。
另一点 - 如果您只是尝试创建一个无法在一个方法之外使用的对象,并且该方法之外的任何尝试操作都将失败,只需将其声明为方法内的本地。