C#在不同的方法中使用:构造函数

C#在不同的方法中使用:构造函数,c#,using,C#,Using,我能找到的C#的using的所有在线示例都直接在using括号内实例化: using (var cnx = new SqlConnection()) { } 我认为下面的操作应该是相同的,但我似乎仍然锁定了资源: SqlConnection GetConnection() { return new SqlConnection(); } void foo() { using (var cnx = GetConnection()) { } } 当我一步一步地完成我的程序并到达用户右括号后

我能找到的C#的
using
的所有在线示例都直接在using括号内实例化:

using (var cnx = new SqlConnection()) { }
我认为下面的操作应该是相同的,但我似乎仍然锁定了资源:

SqlConnection GetConnection() { return new SqlConnection(); }
void foo()
{
    using (var cnx = GetConnection()) { }
}
当我一步一步地完成我的程序并到达用户右括号后面的行时,我希望能够使用SQLServerManagementStudio以任何我想要的方式修改db,但我不能。当我关闭应用程序时,错误就会消失

这不是与SQL隔离的;我也曾以这种方式打开文件流。也就是说:使用块跳过
,但操作系统不允许外部应用程序更改文件


我是否在使用
合同违反了
的某些部分?

使用返回适当资源的方法是绝对正确的。特别是,这是非常常见的:

using (var writer = File.CreateText(path))
{
}
(以及
文件
中的类似方法)


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

我一直在使用这类代码:

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

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

如果您确实想确定,请调用
cnx.Close()在结束括号之前。但是,在我的情况下,这是不必要的,因为调用
Dispose
会自动关闭连接。

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

您希望更改已处理的连接吗?否,我认为OP的意思是,即使在using部分结束后(连接应该被释放),数据库仍然被锁定。是的,OP使用
的方式没有任何问题。