4

私は C# と OOP を理解し始めていますが、回避できないような問題があります。いくつかのプロパティを (System.Collections.Generic.Dictionary オブジェクトの形式で) 保持する DataSet というクラスがあります。クラス内には、データベースからデータをロードするメソッドがあり、これらのメソッドを使用して 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. 重要な問題は、Property1 が既知/設定された後にのみ Property3 を設定できることです。それが可能かどうかはわかりません...

どんな助けでも大歓迎です。

4

5 に答える 5

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
}

重要な問題は、Property1 が既知/設定された後にのみ Property3 を設定できることです。それが可能かどうかはわかりません...

ご覧のとおり、これは上記のコードで解決されています。

于 2013-05-29T09:44:35.673 に答える
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

辞書をロードしてからキャッシュする必要があるようです。プロパティゲッターでこれを怠惰に行うことができます:

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 に答える