在“使用”中检测“使用”

Detect "using" within "using"

提问人:Dominique 提问时间:5/23/2023 最后编辑:Dominique 更新时间:5/23/2023 访问量:121

问:

我正在开发一个 C# 应用程序,它经常使用以下源代码:

using (var database ...

我遇到了一个问题(抛出了一个异常),我担心它可能是由一个子句引起的,在另一个子句中被调用(在同一个变量上:我不关心不同变量上的嵌套子句)。usingusingusing

有没有办法使用 Visual Studio 调试器来检测这一点?

提前致谢

嵌套的 C# Visual Studio 调试

评论

6赞 Jon Skeet 5/23/2023
嵌套的 using 语句几乎总是好的。检测它几乎总是一个坏主意。与其直接在 VS 中进行检测,我建议将时间花在您面临的特定问题上。
0赞 Dmitry Bychenko 5/23/2023
using里面还挺好的:usingusing (var dataBase = new SqlConnection(...)) { ... using (var q = new SqlCommand(...)) { ... using (var reader = q.ExecuteReader()) {...} } }
1赞 Dmitry Bychenko 5/23/2023
你有什么样的例外(类型和消息)?你能提供相关代码吗?
1赞 Ralf 5/23/2023
您的意思是您有多个连接嵌套在同一个数据库上?然后,你应该看看你对事务的处理,以及如果你的对象处于不确定状态,并且在数据库中找不到它们时,什么连接可以看到什么。
1赞 Jon Skeet 5/23/2023
@RandRandom:我确信该规则有例外,但不足以使拥有通用 VS 检测器有用。不幸的是,这个问题并不是很清楚,IMO。

答:

1赞 CharithJ 5/23/2023 #1

这不太可能导致问题。我能想到的唯一可能导致的异常是,如果对已释放的对象执行操作,则会抛出。 如果您遇到其他异常,则可能与 无关。usingusingObjectDisposedExceptionusing

出于调试目的,您可以注释掉所有 using 语句,并尝试该异常是否仍然发生。

如果在完成使用之前处理项目有任何问题,您可以将这些相关项目添加到一个 using 块下。所以,它们都将被一起处理。

例如:

using (var db = new Database())
using (var con= new DBCon())
{
    
} 

评论

1赞 Rand Random 5/23/2023
是的,不是真的——class Foo { bool IsClosed => IsDisposed ? throw new MyFancyExcption() : false; }
0赞 CharithJ 5/23/2023
@RandRandom是的,如果有人尝试了 Fancy Exception,这是可能的。至少 FancyException 应该派生自 ObjectDisposedException?无论如何,我同意,我会纠正我的措辞。谢谢
1赞 Charlieface 5/23/2023
Dispose()即使多次调用也不应该抛出,虽然有糟糕的实现
0赞 CharithJ 5/23/2023
@Charlieface 当然,多次调用 Dispose 不会在 Dispose 方法中引发异常。我的意思是,如果它尝试使用已经处理的对象,可能会导致问题。