2010-02-22 45 views
4

我正在浏览ASP.NET应用程序中的一些旧的C#.NET代码,确保所有SqlConnections都使用块封装在中。如果我在方法中的一个using块中返回一个值,在返回之前是否使用了对象的处理方式?

我知道使用相同尝试/终于它在处置对象的最终无论在尝试会发生什么。如果我有一个返回使用内的值,即使执行离开的方法,当它返回一个方法,它还是叫.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

回答

3

是的,它仍然会调用处置。

运行这个非常简单的控制台应用程序顶部验证:

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 
    } 
9

是。它会处理你的对象。这实际上将导致您的代码中的问题,因为返回的SqlCommand取决于SqlConnection,这将在控制流返回到您的主叫处置之前的。

你可以,但是,使用委托来解决这个问题。一个很好的模式来处理,这是重写你的方法,像这样:

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... 
    }); 
+0

哇,好赶上!谢谢。这种方法是不是在很多地方使用的(并且是旧的),所以我可能会只是将其删除,并创建我需要他们的命令 – adambox 2010-02-22 18:55:58

相关问题