4

我开始了解 C# 和 OOP,并且遇到了一个我似乎无法解决的问题。我有一个名为 DataSet 的类,它应该包含几个属性(以 System.Collections.Generic.Dictionary 对象的形式)。在类中,我有从数据库加载数据的方法,这些方法应该用于初始化 DataSet。基本上,当我从 Main 方法实例化它时,我希望 DataSet 对象设置所有属性。

我所拥有的是以下(省略细节):

public class DataSet
{
    public IDictionary<string, MyClass1> Property1 { get; set; };
    public IDictionary<string, MyClass2> Property2 { get; set; };
    public IDictioanry<string, MyClass3> Property3 { get; set; };

    public DataSet()
    {
            Property1 = new Dictionary<string, MyClass1>();
            Property2 = new Dictionary<string, MyClass2>();
            Property3 = new Dictionary<string, MyClass3>();
        // Set Property1
        // Set Property2
        // Set Property3 (can only be done when Property1 is known)
    }

    private void GetProperty1(/* something? */)
    {
        // Loads the data from a database.
    }

    private static Dictionary<string, MyClass1> GetProperty1Alternative(DataSet dataSet)
    {
        // Same thing but static, so needs instance ref.
    }

    // Similarly for Property2 and Property3
}

我想要的是在构造函数中设置属性。我的问题基本上是:

  1. 我正在做的事情是正确的吗?
  2. 如果是,我应该让我的方法静态(并通过引用方法传递一个实例),这将要求类 DataSet 是静态的(及其所有属性),或者有没有办法在不制作 DataSet 的情况下做我正在做的事情静止的?
  3. 一个重要问题是 Property3 只能在 Property1 已知/设置后设置。我不知道这是否可能......

任何帮助是极大的赞赏。

4

5 回答 5

2

您的代码中有一些问题。您已将属性公开,因此拥有 GetProperty1 并没有真正意义。另一种方法是使字典成为私有变量,然后您可以拥有:

public IDictionary<string,MyClass1> GetProperty1()
{
    if ( _property1 == null )
    {
        _property1 = LoadFromDatabase();
    }
    return _property1;
}

同样对于 property3,您还可以在创建并返回它之前检查 proeprty1 是否不为 null,但您还需要决定要做什么(首先自动加载属性 1,否则为 property3 返回 null)

于 2013-05-29T09:11:23.127 回答
0

在我看来,你需要加载你的字典,然后想要缓存它。您可以在属性 getter 中懒惰地执行此操作:

public class DataSet
{
    private IDictionary<string, MyClass> property;

    public IDictionary<string, MyClass> Property
    {
        if (property == null)
        {
            property = LoadProperty();
        }
        return property;
    }
}

或急切地在构造函数中:

public class DataSet
{
    public IDictionary<string, MyClass1> Property { get; private set; }    

    public DataSet()
    {
        Property = LoadProperty();
    }
}

此外,使用这种方法没有多大意义:

private static Dictionary<string, MyClass1> GetProperty1Alternative(DataSet dataSet)

而不是这样调用:

DataSet.GetProperty1Alternative(anInstance);

你可以简单地这样做:

anIntance.Property;
于 2013-05-29T09:21:15.690 回答
0

您可以使用以下代码。它可以解决你几个问题。

public class DataSet
{
    private DataSet()
    {
    }

    public DataSet _instance = null;
    public static DataSet Instance
    {
       get{ if (_instance = null){_instance = new DataSet();}return _instance;}
    }


    private IDictionary<string, MyClass1> _property1 = null;
    public IDictionary<string, MyClass1> Property1
    {
        get
        {
           result = _property;
           if (result == null)
           {
             //read database
           } 
           return result;
        }
    }
于 2013-05-29T09:13:51.247 回答
0

为什么不添加一个公共函数,例如 LoadData(),它可以在您的对象构建后调用。这可以使用正确的顺序加载所有数据。我想你甚至可以在构造函数中调用它。我也会听从 Lukos 的建议,用公共 get 属性创建一些私有成员变量。

于 2013-05-29T09:16:40.633 回答
0

我正在做的事情是正确的吗?

你离得并不远。我认为很多人将您的Get功能混淆为传统的“吸气剂”,因此您应该重命名它。

如果是,我应该让我的方法静态(并通过引用方法传递一个实例),这将要求类 DataSet 是静态的(及其所有属性),或者有没有办法在不制作 DataSet 的情况下做我正在做的事情静止的?

您可以使这些方法实际加载数据静态,并且您不需要传递实例 - 您只需返回数据即可。(我已经更改了函数名称)。从实例/构造函数调用静态方法很好,但反过来不行。

public DataSet()
{
        Property1 = LoadProperty1();
        Property2 = LoadProperty2();
        Property3 = LoadProperty3();//can only be done when Property1 is known
}

private static Dictionary<string, MyClass1> LoadProperty1()
{
    // load data
}

一个重要问题是 Property3 只能在 Property1 已知/设置后设置。我不知道这是否可能......

如您所见,这在上面的代码中得到了解决。

于 2013-05-29T09:44:35.673 回答