在for循环中使用相同的对象 - C#

时间:2012-12-13 12:41:29

标签: c# oop object

在此scnario中,程序将xmlfiles放在目录中。如果已经在listToWatch列表中添加了xmlfile,则会在第二种方法中对其进行评估。但是,firstMethod也会循环用于评估每个目录(下面没有写入)。

程序检测xml文件中已添加的所有文件。但是如果程序进入另一个目录(因为firstMethod在另一个类中循环),则传递listToWatch = new List(),删除先前的listToWatch并创建一个新对象。

我希望使用相同的对象而不会被新列表覆盖。我不能将listToWatch = new List放在secondMethod中,因为它有一个for循环,它只会用一个新对象覆盖listToWatch。我不能把它放在firstMethod中,因为它需要在secondMethod中设置。我也不能把它放在类Sample中。我应该在哪里放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();
            }
        }
    }

5 个答案:

答案 0 :(得分:8)

如何将它与getter和setter一起使用?

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

}

必须说,可能是让方法返回此对象而不是存储它的更好选项,但如果由于某种原因你不能改变它,我认为这将有效

编辑:感谢@gorpik,这称为“ property ”而不是“使用getter和setter ”。

答案 1 :(得分: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();
            }
        }
    }
}

答案 2 :(得分:1)

如果你没有关于冗余内存分配的偏执(如果是空的dir,空的xml - 不需要列表),只需在静态声明本身中初始化ListToWatch:

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

注意缺少的setter:只允许此类更改listToWatch引用。

答案 3 :(得分:0)

您只需将new List<string>()语句移动到firstMethod,这样就可以为它要添加的所有文件创建一次字符串列表。

答案 4 :(得分:0)

您只需创建一次此List,因此请在firstMethod上进行。 尝试隔离代码响应性。

我认为@ Gonzalo.-解决方案很有趣。

干杯