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

时间:2010-02-22 18:37:36

标签: c# .net idisposable

我正在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

2 个答案:

答案 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
    }