Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测对象是否位于';使用';范围_C#_.net - Fatal编程技术网

C# 如何检测对象是否位于';使用';范围

C# 如何检测对象是否位于';使用';范围,c#,.net,C#,.net,请参阅我的示例代码: 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()

请参阅我的示例代码:

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();
}
不可能


它可以获取堆栈转储以确定调用代码的位置,并分析代码以尝试确定其功能。它可以查找
using
块生成的
try…finally
dispose
,但它仍然无法判断它是否确实是
using
块。

您不能。无论如何,这不会有任何区别。您所要做的就是创建对象,调用一些方法,然后处理它。为什么
someAction
的行为应该根据将来某个时候是否调用
Dispose
而改变

我想构造一个 只能在以下情况下调用它的方法 它位于“使用”范围内

不,那是不可能的

您想要这样的功能的唯一原因是要保证对象在离开作用域时总是得到处理,并且有更好的方法来实施这种逻辑


如果您使用的是VS2010,那么您可以将FxCop用于实现
IDisposable
的对象。如果您创建了一个对象而没有对其进行处理,那么FxCop将使您的构建失败,而这正是为满足您的需求而提供的编译器保证。

您不能,也不应该这样做。using语句是手动调用Dispose()方法的try/finally的语法糖。这两个都是完全有效的用例,因此您的方法显式检查using语句是不合适的(即使它可以——它不能)。为什么testObject应该知道它在“using范围”中?离开作用域时,只有编译器必须知道调用dispose。这里真正的问题是“为什么”为什么您想知道它是否在使用作用域中?如果它应该在using作用域中,在它周围创建一个包装类或其他东西。@kirk我知道using语句是如何wroks@Tim的,因为我想构造一个对象,如果它位于“using”作用域中,则只能调用它的方法。@Roberto。是否要强制对象的用户始终使用使用?另一个选项是添加一个终结器,如果对象尚未被释放,该终结器将抛出。我对调试版本中的某些对象执行此操作。抱歉@Juliet,但您不能认为这是我想要这样功能的唯一原因。我只是想知道这是否可能,并不是真的在“为什么”这一部分征求意见。