6

using我可以在使用括号内直接找到 C# 实例化的所有在线示例:

using (var cnx = new SqlConnection()) { }

我认为以下内容应该相同,但我似乎仍然锁定了资源:

SqlConnection GetConnection() { return new SqlConnection(); }
void foo()
{
    using (var cnx = GetConnection()) { }
}

当我逐步执行我的程序并到达 using 的右括号之后的行时,我希望能够使用 SQL Server Management Studio 以任何我想要的方式更改数据库,但我不能。当我关闭我的应用程序时,错误就会消失。

这不与 SQL 隔离;我也经历过以这种方式打开文件流的情况。那就是:越过using块,但操作系统不允许外部应用程序更改文件。

我是否违反了using合同的某些部分?

4

3 回答 3

5

使用返回适当资源的方法绝对没问题。特别是,这很常见:

using (var writer = File.CreateText(path))
{
}

(以及 中的类似方法File)。

基本上,这与调用方法或调用构造函数无关——肯定有其他问题。如果您可以创建一个简短但完整的程序来演示问题(最好使用文件而不是数据库),那么我们很可能能够帮助您找出问题所在,而不仅仅是问题所在:)

于 2013-02-13T16:04:55.540 回答
3

如果您启用了连接池,“Dispose”不一定会物理关闭连接。

于 2013-02-13T16:13:49.863 回答
0

我一直在使用这种代码:

SqlConnection GetConnection() 
{ 
    return new SqlConnection(); 
}

void foo()
{
    using (var cnx = GetConnection()) 
    { 
        cnx.Open();
    }
}

如果您真的想确定,请cnx.Close();在右括号之前调用。但是,在我的情况下,这从来没有必要,因为调用Dispose自动关闭连接。

于 2013-02-13T16:09:11.350 回答