2010-08-31 164 views
2

请参阅我的示例代码:如何检测对象是否在“使用”范围内?

var testObject = new SomeClass(); 
using (testObject) 
{ 
    //At this point how can the testObject implicitly know 
    //if it is placed inside a 'using' scope? 

    // In other words, how can testObject know that 
    // .SomeAction() is being called from within a 'using' scope? 

    testObject.someAction(); 
} 
+6

你不能,你不应该。 ** using **语句是try/finally的语法糖,它手动调用Dispose()方法。两者都是完全有效的用例,因此你的方法显式检查using语句是不恰当的(即使它可以 - 它不能)。 – 2010-08-31 21:18:36

+0

为什么testObject应该知道它在“使用范围”中?只有编译器必须知道在离开示波器时调用dispose。 – 2010-08-31 21:19:17

+1

这里真正的问题是“为什么”你为什么想知道它是否在使用范围内?如果它应该在使用范围内,请围绕它创建一个包装类。 – McKay 2010-08-31 21:22:26

回答

5

这不可能。

它可以通过堆栈转储来确定调用代码的位置,并分析代码以确定它的功能。它可能会寻找using块生成的try...finalydispose,但它仍不能确定它是否实际上是否为using块。

0

你不能。它无论如何不会有任何分别。你所做的只是创建对象,调用一些方法,然后处理它。为什么someAction的行为会根据是否在将来某个时候调用Dispose而发生变化?

0

我想构造一个对象, 只能如果 它被放置在“使用”范围之内,它被称为方法。

不,这是不可能的。

你为什么想要想要这样的功能的唯一原因是保证一个对象总是在离开作用域时被丢弃,并且有更好的方法来执行这个逻辑。

如果您使用VS2010,则可以使用FxCop的Dispose objects before losing scope作为实现IDisposable的对象。如果你创建一个对象而不处理它,FxCop会让你的构建失败 - 这与编译器保证一样好,因为你可以满足你的需求。

+0

另一个选择是添加一个终结器,如果该对象尚未处置,则抛出该终结器。我为调试版本中的某些对象执行此操作。 – 2010-08-31 22:01:32

+0

对不起@Juliet,但你不能认为这是我想要这样的功能的唯一原因。我只想知道它是否可能,是不是真的在为什么要求建议。 – 7wp 2010-08-31 22:08:43