无限循环stackoverflow对象列表异常

时间:2015-07-20 20:44:25

标签: c# list csv while-loop

我有这段代码:

public List<CsvUserData> CsvUserList = new List<CsvUserData>();

public CsvUserData()
{
    readCSV(@"C:\userdata.csv");
}

public string CSVEmailEditText { get; set; }
public string CSVNameEditText { get; set; }
public string CSVAddressEditText { get; set; }
public string CSVPostnumEditText { get; set; }
public string CSVCityEditText { get; set; }
public string CSVPhoneEditText { get; set; }
public string CSVCommentEditText { get; set; }
public string SelectPage { get; set; }

private void readCSV(string location)
{
    var reader = new StreamReader(File.OpenRead(location));
    string line;
    string[] values;
    while (!reader.EndOfStream)
    {
        line = reader.ReadLine();
        values = line.Split(',');

        CsvUserList.Add
        (
            new CsvUserData
            {
                CSVEmailEditText = values[0],
                CSVNameEditText = values[1],
                CSVAddressEditText = values[2],
                CSVPostnumEditText = values[3],
                CSVCityEditText = values[4],
                CSVPhoneEditText = values[5],
            }
        );
    }
}

我正在尝试将csv文件读入由名为CsvUserData的对象组成的列表中,上面显示了类定义。一旦类被实例化,我的程序进入无限循环,一旦列表内存已满,最终导致stackoverflow异常,即使我的csv文件只有一行数据。有人可以帮助我并解释为什么会这样吗?

1 个答案:

答案 0 :(得分:5)

让我们看看:

  1. 创建一个新的CsvUserData对象,调用构造函数。
  2. readCSV(@"C:\userdata.csv");
  3. 内部readCSV:打开文件,然后遍历各行。
  4. 每行:new CsvUserData { … }
  5. 转到1.
  6. 因此,您最终会在 CsvUserData类型的构造函数中的中创建新的CsvUserData个对象。所以这将永远重复。

    您可能打算将readCSV方法设为静态或其他方式,并且只将其称为一次。实际上没有理由从构造函数中调用它。并且构造函数不应该真正打开文件并根据文件创建东西;这对构造函数来说太过分了。