c# - 为什么 IDisposable 立即调用 Dispose()?

标签 c# asp.net-mvc-4 iis idisposable

我有一个 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/

相关文章:

c# - javascript 正则表达式的正则表达式

c# - 使用 .NET 在 Windows 中检测屏幕录制

c# - 性能数组乘法 Pearson

c# - 将无序列表中的数据与 C# 中的 POCO 一起或与 POCO 一起发回 Controller 操作

.net - 64 位版本的 Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader 程序集

c# - 正确的 LINQ where 子句

c# - 在 Microsoft 的 MVC 和 Javascript 之间共享本地化 ui 字符串的规范方法是什么?

css - 如何将类放入 Html.Dropdownlist 中?

iis - 使用 OpenSSO/AM 和 get 方法将信息从一个页面发送到另一个页面

c# - 如何在.net mvc中获取带有应用程序名称的url?