2

このシナリオでは、プログラムはディレクトリ内のxmlfilesを取得します。各xmlfileは、listToWatch Listにすでに追加されている場合、2番目のメソッドで評価されます。ただし、firstMethodは、各ディレクトリの評価のためにもループされます(以下には記述されていません)。

プログラムは、すでに追加されているxmlファイル内のすべてのファイルを検出します。ただし、プログラムが別のディレクトリに移動すると(firstMethodが別のクラスでループされるため)、listToWatch = new List()が渡され、前のlistToWatchが消去され、新しいオブジェクトが作成されます。

新しいリストで上書きせずに同じオブジェクトを使用したい。forループがあり、listToWatchを新しいオブジェクトで上書きするだけなので、listToWatch =newListをsecondMethodに入れることはできません。secondMethodで設定する必要があるため、firstMethod内にも配置できません。サンプルクラスに入れることもできません。listToWatch = new List()はどこに置くべきですか?

class Sample
{
    public static List<string> listToWatch
    {
        get;
        set;
    }

    public static void firstMethod()
    {
        string getFiles = Directory.GetFiles(directory, "*.xml");
        foreach (string xmlFile in getFiles)
        {
            secondMethod(xmlFile);
        }
    }

    public static void secondMethod(xmlFile)
    {
        listToWatch = new List<string>();
        foreach (string file in xmlFile)
        {
            if (listToWatch.Contains(file))
            {
                sw.WriteLine(file + " is already added!");
            }
            else
            {
                listToWatch.add();
            }
        }
    }
4

5 に答える 5

8

ゲッターとセッターでそれを使用するのはどうですか?

private static List<string> _ListToWatch;
public static List<string> ListToWatch
{
    get
        {
         if(_ListToWatch == null) 
              _ListToWatch = new List();
          return _ListToWatch;
         }
    set 
     {
      _ListToWatch = value;
     }

}

言うまでもなく、メソッドがこのオブジェクトを格納するのではなく返すようにするためのより良いオプションですが、何らかの理由でそれを変更できない場合は、これでうまくいくと思います

編集:@gorpikのおかげで、これは「プロパティ」と呼ばれ、「ゲッターとセッターを使用する」ではありません。

于 2012-12-13T12:45:44.710 に答える
1

静的コンストラクターでlistToWatchを初期化するか、Gonzaloが提案しているメソッドを使用できます。

class Sample
{
    static Sample()
    {
        listToWatch = new List<string>();
    }

    public static List<string> listToWatch
    {
        get;
        set;
    }

    public static void firstMethod()
    {
        string[] getFiles = Directory.GetFiles(directory, "*.xml");
        foreach (string xmlFile in getFiles)
        {
            secondMethod(xmlFile);
        }
    }

    public static void secondMethod(xmlFile)
    {
        foreach (string file in xmlFile)
        {
            if (listToWatch.Contains(file))
            {
                sw.WriteLine(file + " is already added!");
            }
            else
            {
                listToWatch.add();
            }
        }
    }
}
于 2012-12-13T12:50:27.220 に答える
1

冗長なメモリ割り当てについて心配していない場合(空のdir、空のxmlの場合、リストは必要ありません)、静的宣言自体でListToWatchを初期化するだけです。

class Sample
{
    private static List<string> listToWatch = new List<string>();
    public static List<string> ListToWatch
    {
        get { return listToWatch; };
    }
...
}

セッターがないことに注意してください。このクラスのみがlistToWatch参照を変更できます。

于 2012-12-13T12:55:26.340 に答える
0

new List<string>()ステートメントをに移動するだけでfirstMethod、追加するすべてのファイルの文字列のリストが1回作成されます。

于 2012-12-13T12:46:42.860 に答える
0

このリストを作成する必要があるのは1回だけなので、firstMethodで作成します。コードの責任を分離してみてください。

@Gonzalo.-回避策はあなたのケースにとって興味深いと思います。

乾杯

于 2012-12-13T12:50:12.510 に答える