【问题标题】:How do I share IDisposable resources within a class?如何在班级内共享 IDisposable 资源?
【发布时间】:2023-03-22 08:28:01
【问题描述】:

我正在编写一些控制台应用程序来在 SQLite 数据库之间移动一些数据。连接的类和各种准备好的语句实现了 IDisposable,所以我使用 using 块来实例化这些对象,如下所示:

using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString))
{
    sqlite_conn.Open();
    using (SQLiteCommand sqlite_cmd = new SQLiteCommand())
    {
        sqlite_cmd.Connection = sqlite_conn;
        sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;";
        sqlite_cmd.ExecuteNonQuery();
    }
    sqlite_conn.Close();
}     

但是,我需要能够在一种方法中创建这些连接,然后在其他方法中调用它们。对我来说,将这些连接存储为实例变量的最简洁、最容易混淆的方式是什么?我想确保以智能方式调用他们的 .Dispose() 方法,但看不到确保所有操作都发生在单个 using 块的上下文中的好方法。

我意识到这是一个 C# 新手问题,因此请调整您的答案。如果您有建议的解决方案,如果您包含代码示例来说明,我会很高兴。

编辑:我的用例是一个控制台应用程序。有人传入源连接字符串和目标连接字符串,控制台应用程序执行操作。我真的会让我的控制台类程序本身像这样实现 IDisposable 吗?:

class Program : IDisposable
{
    private SQLiteConnection sourceConnection;
    private SQLiteConnection destinationConnection;

    public void Dispose()
    {
        sourceConnection.Dispose();
        destinationConnection.Dispose();
    }  
}

【问题讨论】:

    标签: c# class-design using-statement


    【解决方案1】:

    我需要能够在一种方法中创建这些连接,然后在其他方法中调用它们。对我来说,将这些连接存储为实例变量的最简洁且最容易混淆的方式是什么?

    在这种情况下,保存这些实例变量的类本身应实现 IDisposable,并且在处置时应确保连接也已处置。

    另外,当你有多个 IDisposables 时,你可以用这种方式重写它,对它们进行分组并减少代码中的嵌套:

    using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString))
    using (SQLiteCommand sqlite_cmd = new SQLiteCommand())
    {
        sqlite_conn.Open();
    
        sqlite_cmd.Connection = sqlite_conn;
        sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;";
        sqlite_cmd.ExecuteNonQuery();
    } // no need to call .Close(): IDisposable normally handles it for you
    

    【讨论】:

    • 对我来说完全有用和有价值的信息。但是,它并没有显示出我需要的那种类设计的好样本。在控制台应用程序中,我会为 Program 类本身实现 IDisposable 吗?我将在我原来的问题中添加详细信息。
    • 好的,编辑添加了我如何解释的示例。
    • 不,程序类不应实现 IDisposable。您通常不应该在程序的生命周期内保持与数据库的连接处于活动状态,除非您希望您的程序寿命很短(这对于控制台应用程序来说是可能的;您可能意味着它在快速批处理脚本中运行启动后没有用户交互)。相反,只需根据需要在每个小方法中重新创建连接。 .Net 中的数据库提供程序实现通常将它们汇集在一起​​以保持高效。
    • 有趣!我没有意识到这一点,并认为为每个事务创建一个新连接会非常浪费。它当然更冗长!我最初放弃这种策略的原因是因为我看到我的应用程序写入速度在应用程序的生命周期中显着减慢。这可能是我正在使用的图书馆的一个弱点吗?在程序的整个生命周期中都会插入大量数据。
    • 也许可以准确地分享您正在尝试做的事情,我们可以帮助您以有效的方式将它们组合在一起。
    【解决方案2】:

    您可以让您的类实现 IDisposable 并确保您在 Dispose 方法中清理连接等。然后调用你的类的方法可以使用(MyClass c ...)。

    【讨论】:

      【解决方案3】:

      一种方法是让您的类实现 IDisposable。在你的类的 Dispose 方法中,调用连接和命令等的 Dispose 方法。然后你可以在 using 块中使用你的类的实例。

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 2015-10-27
        • 1970-01-01
        相关资源
        最近更新 更多