我有此代码:

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的对象的列表中,该类定义显示在上方。一旦实例化该类,我的程序便进入无限循环,一旦列表内存已满,即使我的csv文件只有一行数据,最终也会导致stackoverflow异常。有人可以帮我解释一下为什么会这样吗?

最佳答案

让我们来看看:


创建一个新的CsvUserData对象,调用构造函数。
readCSV(@"C:\userdata.csv");
readCSV内部:打开文件,然后遍历各行。
对于每一行:new CsvUserData { … }
转到1。


因此,您最终从CsvUserData类型的构造函数中创建了新的CsvUserData对象。因此,这将永远重复。

您可能打算将readCSV方法设为静态或类似的方法,并且只调用一次。确实没有理由从构造函数中调用它。而且构造函数不应真正打开文件并根据该文件创建内容。对于构造函数而言,这是太多的工作。

关于c# - 无限循环stackoverflow对象列表异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31525982/

10-11 04:06