我正在ASP.NET应用程序中查看一些旧的C#.NET代码,确保所有 SqlConnections 都包含在中使用块。
我知道使用与尝试 / 最终相同,它在最终中处理对象>无论尝试中发生了什么。如果我有一个方法在中使用返回一个值,即使执行返回时执行离开了方法,它还是在/之前调用我的对象上的 .Dispose()在它返回期间/之后?
public static SqlCommand getSqlCommand(string strSql, string strConnect){
using (SqlConnection con = new SqlConnection(strConnect))
{
con.Open();
SqlCommand cmd = GetSqlCommand();
cmd.Connection = con;
cmd.CommandText = strSql;
return cmd;
}
}
更新:接受的答案是我认为最能回答我的问题的答案,但请注意this answer抓住了这段代码的愚蠢,我正在返回一个使用处理的命令连接! :P
答案 0 :(得分:9)
是。它会处理你的物体。这实际上会导致代码出现问题,因为返回的SqlCommand
取决于SqlConnection
,在控制流返回给调用者之前,它将是Disposed。
但是,您可以使用代理来解决此问题。处理此问题的一个好方法是重写您的方法,如下所示:
public static SqlCommand ProcessSqlCommand(string strSql, string strConnect, Action<SqlCommand> processingMethod)
{
using (SqlConnection con = new SqlConnection(strConnect))
{
con.Open();
SqlCommand cmd = GetSqlCommand();
cmd.Connection = con;
cmd.CommandText = strSql;
processingMethod(cmd);
}
}
然后你可以这样称呼:
ProcessSqlCommand(sqlStr, connectStr, (cmd) =>
{
// Process the cmd results here...
});
答案 1 :(得分:3)
是的,它仍然会调用dispose。
运行这个非常简单的控制台应用程序顶部验证:
class Program
{
static void Main(string[] args)
{
TestMethod();
Console.ReadLine();
}
static string TestMethod()
{
using (new Me())
{
return "Yes";
}
}
}
class Me : IDisposable
{
#region IDisposable Members
public void Dispose()
{
Console.WriteLine("Disposed");
}
#endregion
}