gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:57:32 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com