可以跨类使用数据集

本文关键字:数据集 | 更新日期: 2023-09-27 17:56:15

我正在使用VS 2010和C#窗口表单。我需要用户输入他有多少对象以及每个对象的权重。然后我需要处理每一个。我通常用于行集合中的每个数据行。

问题是我尝试清理一些非常讨厌的代码(顺便说一句,这是我的第一个真实项目)我有一个 ~5000 行代码的主类,并希望将特定的模块集分解为自己的类。问题是当用户输入信息时,我必须在主窗体(DSObjects)上设置数据集,并使用添加按钮链接表格网格视图和几个输入框,以便用户可以添加所需的数据。我遇到的问题是,当我运行代码并将类分解为子类时,数据集在每个新类上都会被清除。

可以跨类使用数据集

不要在每个类中创建数据集的新实例,而是传递一个实例,例如:

public class AnotherClass
{
    private DataSet m_dataSet;
    public AnotherClass(DataSet ds)
    {
        m_dataSet = ds;
    }
}

创建新的AnotherClass实例时,请使用:

AnotherClass ac = new AnotherClass(m_dataSet);

其中m_dataSet又是引用数据集的成员变量 - 要么传递给构造函数中的调用类,要么(如果是主类)在代码中的某处创建。

仅创建一次数据集,例如在主类中创建。

另一种方法是使用保存数据集实例的单一实例类。然后可以从许多不同的对象访问单例。

非线程安全示例为:

public class DataHolder
{
    private DataSet m_dataSet;
    private static DataHolder m_instance;
    private DataHolder()
    {
        m_dataSet = ... // Fill/Create it here
    }
    public static DataHolder Instance
    {
        get
        {
            if (m_instance = null)
                m_instance = new DataHolder();
            return m_instance;
        }
    }
    public DataSet Data
    {
        get { return m_dataSet; }
    }
}

然后,使用 DataHolder.Instance.Data 访问它;

您可以尝试将数据集传递到每个类的构造函数中

var something = new Something(dataset)

请记住,数据集实际上是内存中的一个小(但完整)数据库。 虽然大多数应用程序只是使用它将数据从数据库服务器传输到应用程序中的对象,但它具有完整数据库的所有部分:多个表,可以连接为关系,可以对它们运行查询。

考虑到这一点,正如您不会为每个类使用单独的数据库,而是为整个应用程序全局使用一个数据库一样,让应用程序中的所有对象共享一个 DataSet 同样非常合理。