对象实例仅对当前方法有效

时间:2015-04-26 20:28:05

标签: c# .net

是否可以创建一个对象来注册当前线程是否离开创建它的方法,还是检查实例上的方法被调用时是否发生了这种情况?

ScopeValid obj;

void Method1()
{
    obj = new ScopeValid();
    obj.Something();
}

void Method2()
{
    Method1();
    obj.Something(); //Exception
}

这项技术可以实现吗?我想开发一种类似于TypedReferenceArgIterator的机制,它不能“逃避”当前的方法。这些类型是由编译器专门处理的,所以我无法完全模仿这种行为,但我希望至少可以创建具有相同结果的类似规则 - 如果它已经转义了它的方法,则禁止访问该对象创建

请注意,我无法使用StackFrame和比较方法,因为对象可能会转义并返回相同的方法。

1 个答案:

答案 0 :(得分:7)

根据调用源更改方法行为是一个糟糕的设计选择。

使用这种方法需要考虑的一些示例问题包括:

  • 可测试性 - 您将如何测试这样的方法?
  • 重构调用代码 - 如果您的代码用户只是对您的错误消息进行了最终操作会说您无法以与创建方法不同的方式执行此操作,该怎么办? " 好的,好的!我只是用同样的方法做坏事,程序员说。"

如果你的代码的用户破坏了它,并且它是他们的错,让它破裂。最好只用以下内容记录你的代码:

  

IInvalidatable - 完成此操作后,实现此成员的类型应使Invalidate()失效。

如果你的代码的用户没有&#,那么忽略这个几乎就像的明显点是重新发明IDisposibleusing { }块(有语言支持) 39;使用得当,它并不是你真正关心的问题。

这在技术上可能与AOP(我在这里思考PostSharp)有关,但它仍然取决于用户正确使用您的代码 - 他们必须在构建过程中使用它,并且如果他们不能运行我们之所以没有使用工具,只是因为你试图让它们变得容易,就是邪恶的。

另一点 - 如果您只是尝试创建一个无法在一个方法之外使用的对象,并且该方法之外的任何尝试操作都将失败,只需将其声明为方法内的本地。

相关:How to find out which assembly handled the request