我有一个 Web 应用程序 (asp.net mvc 4),它在解决方案的另一个项目中使用 IDisposable。它在 Visual Studio (2012) 中编译和运行良好,但是当使用浏览器运行 Web 应用程序(使用 IIS 8 Express)时,会抛出异常。
使用 IDisposable 的密封类位于 using 语句中,并且在到达 using 大括号中的任何代码之前调用 Dispose() 方法,即
using (MySealedClass msc = new MySealedClass())
{
//Code doesn't reach here. Dispose() is called beforehand
//My code here . . .
}
构造函数及其依赖项是:
private readonly IList<IntPtr> _intPtrList;
public MySealedClass()
{
_intPtrList = new List<IntPtr>();
}
所以我认为那里应该没有任何问题。为了测试这一点,我在代码的前面实例化了 MySealedClass,而不使用 using 语句,如下所示:
MySealedClass msc = new MySealedClass()
代码可以超越这一点,然后我可以调用它的方法。
我在 MSDN 上看到过一些示例,其中 using 语句代码被编译器转换为 try catch 模式,但我不认为这解释了错误,因为错误发生在我的主 block 代码之前。
谁能解释一下 using 语句是否做了额外的事情?例如它是否扫描代码块的其余部分,如果有不喜欢的内容,则调用 Dispose() 方法。
我的怀疑在于 IIS,之前,我遇到了不安全的代码错误(尽管 web.config 中的配置正确),但我忘记让 IIS 以 x64 方式运行应用程序。使用 regedit 完成此操作后就很好了。
其他信息:在 using block 中,存在不安全代码以及使用 [DllImport] 属性调用外部 dll。
非常感谢
最佳答案
using (MySealedClass msc = new MySealedClass())
{
//Code doesn't reach here. Dispose() is called beforehand
//My code here . . .
}
由编译器翻译成与此非常相似的内容:
MySealedClass msc = null;
try
{
msc = new MySealedClass();
//My code here . . .
}finally{
if(msc != null){
((IDisposable)msc).Dispose():
}
}
编译器不会事先检查您的代码,如果发现不喜欢的内容,则会跳过它。
所以对我来说,在你到达要检查的点之前,你会遇到一个异常,导致它进入finally block 并处置你的对象。
关于c# - 为什么 IDisposable 立即调用 Dispose()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18914908/