如果我在方法中的using块内返回一个值,那么在返回之前是否使用了对象的处理?

我正在ASP.NET应用程序中查看一些旧的C#.NET代码,确保所有SqlConnections使用块包装。

我知道使用try / finally相同,无论try中发生什么,它都会在finally中处理对象。 如果我有一个方法在using中返回一个值,即使execute返回时执行离开了方法,它仍然会在返回之前/期间/之后调用我的对象上的.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; } } 

更新:接受的答案是我认为最能回答我的问题的答案,但请注意, 这个答案抓住了这段代码的愚蠢,我正在返回一个使用已处理连接的命令! :P

是的,它仍然会调用dispose。

运行这个非常简单的控制台应用程序top verify

  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 } 

是。 它会丢弃你的物体。 这实际上会导致代码出现问题,因为返回的SqlCommand依赖于SqlConnection ,在控制流返回给调用者之前,它将是Disposed。

但是,您可以使用代理来解决此问题。 处理此问题的一个好方法是重写您的方法,如下所示:

 public static SqlCommand ProcessSqlCommand(string strSql, string strConnect, Action 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... });