If I return a value inside a using block in a method, does the using dispose of the object before the return?

前端 未结 2 443
走了就别回头了
走了就别回头了 2020-12-11 08:03

I\'m going through some old C#.NET code in an ASP.NET application making sure that all SqlConnections are wrapped in using blocks.

相关标签:
2条回答
  • 2020-12-11 08:42

    Yes it will still call dispose.

    Run this very simple console application 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
        }
    
    0 讨论(0)
  • 2020-12-11 08:54

    Yes. It will dispose of your object. This will actually cause a problem in your code, since the SqlCommand being returned is dependent on the SqlConnection, which will be Disposed of prior to the control flow returning to your caller.

    You can, however, use delegates to work around this. A good pattern to handle this is to rewrite your method like so:

    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); 
        } 
    } 
    

    You can then call this like:

    ProcessSqlCommand(sqlStr, connectStr, (cmd) =>
        {
            // Process the cmd results here...
        });
    
    0 讨论(0)
提交回复
热议问题