【问题标题】:Is there any difference to instantiate a new MySqlConnection object VS pass in instantiated MySqlConnection object into the "using" statement in C#?实例化一个新的 MySqlConnection 对象 VS 将实例化的 MySqlConnection 对象传入 C# 中的“使用”语句有什么区别?
【发布时间】:2019-10-14 09:39:29
【问题描述】:

我想知道实例化新的 MySqlConnection 对象与将实例化的 MySqlConnection 对象传递到 C# 中的“使用”语句中是否有任何区别?

如果是,最好的方法是什么?为什么它比另一个更可取?

下面是模拟这两种情况的示例代码:-

public class QueryService() {
    private IDbConnection con;

    public QueryService() {
        con = new MySqlConnection(connectionString));
    }

    public List<ExampleDto> QueryList() {
        using (con)
        {
            con.Open();
            // Do work here; connection closed on following line.
        }
    }
}

public class QueryService() {
    public QueryService() {}

    public List<ExampleDto> QueryList() {
        using (var con = new MySqlConnection(connectionString)))
        {
            con.Open();
            // Do work here; connection closed on following line.
        }
    }
}

【问题讨论】:

  • 你知道using是什么意思吗?如果您调用 QueryList 会发生什么情况?您的第一个代码会调用两次?
  • 作为一般规则,将一次性资源的范围保持在尽可能小,以尽量减少泄漏的机会。在您的代码中,如果从不调用 QueryService.QueryList(例如,因为发生异常),则永远不会释放连接。作为一个更的一般规则,将您使用的anything的范围尽可能小,不管是否是一次性的——这使得代码更容易推理。
  • @Selvin 是的,我知道using 是什么意思,是的,QueryList 会被多次调用。
  • 是的。 (这是假设MySqlConnection 实现了连接池,就像任何理智的数据库驱动程序一样。)
  • 我猜是因为问题不是问 using 是什么意思? .. 是的,QueryList 会被多次调用。 ...所以这意味着不......你不知道会发生什么......好吧,我会告诉你......you would use disposed object which will end with Exception

标签: c# dapper mysqlconnection


【解决方案1】:

“using”在使用范围的末尾执行“Dispose”。 因此,在这两种情况下,您最终都会获得已处置的连接。

但在第一种情况下,您仍然可以访问已释放的变量。 这不是推荐的方式,但是是允许的。

您可以对这个已处置的变量做的唯一事情是分配一个新值。 其他任何事情都会失败。变量的内容没有设置为null。

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多