C# 无限循环堆栈溢出对象列表异常

C# 无限循环堆栈溢出对象列表异常,c#,list,csv,while-loop,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 CSV

我有以下代码:

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],
            }
        );
    }
}
public List CsvUserList=new List();
公共CsvUserData()
{
readCSV(@“C:\userdata.csv”);
}
公共字符串CSVEmailEditText{get;set;}
公共字符串CSVNameEditText{get;set;}
公共字符串CSVAddressEditText{get;set;}
公共字符串CSVPostnumEditText{get;set;}
公共字符串CSVCityEditText{get;set;}
公共字符串csvphoneeditext{get;set;}
公共字符串CSVCommentEditText{get;set;}
公共字符串SelectPage{get;set;}
私有void readCSV(字符串位置)
{
var reader=newstreamreader(File.OpenRead(location));
弦线;
字符串[]值;
而(!reader.EndOfStream)
{
line=reader.ReadLine();
值=行分割(',');
CsvUserList.Add
(
新的CSVuser数据
{
CSVEmailEditText=值[0],
CSVNameEditText=值[1],
CSVAddressEditText=值[2],
CSVPostnumEditText=值[3],
CSVCityEditText=值[4],
CSVPhoneEditText=值[5],
}
);
}
}
我正在尝试将
csv
文件读入由名为
CsvUserData
的对象组成的列表,上面显示了类定义。一旦类被实例化,我的程序就会进入无限循环,最终导致列表内存满时出现
stackoverflow
异常,即使我的csv文件只有一行数据。有人能帮我解释一下为什么会这样吗?

让我们看看:

  • 创建一个新的
    CsvUserData
    对象,调用构造函数
  • readCSV(@“C:\userdata.csv”)
  • 内部
    readCSV
    :打开文件,并在行上迭代
  • 每行:
    new CsvUserData{…}
  • 转到1
  • 因此,您最终将从
    CsvUserData
    类型的构造函数中创建新的
    CsvUserData
    对象。所以这将永远重复

    您可能打算将
    readCSV
    方法设置为静态或其他方式,并且只调用它一次。实际上没有理由从构造函数调用它。构造函数不应该真正打开一个文件并基于该文件创建内容;这对一个构造器来说太多了。

    让我们看看:

  • 创建一个新的
    CsvUserData
    对象,调用构造函数
  • readCSV(@“C:\userdata.csv”)
  • 内部
    readCSV
    :打开文件,并在行上迭代
  • 每行:
    new CsvUserData{…}
  • 转到1
  • 因此,您最终将从
    CsvUserData
    类型的构造函数中创建新的
    CsvUserData
    对象。所以这将永远重复


    您可能打算将
    readCSV
    方法设置为静态或其他方式,并且只调用它一次。实际上没有理由从构造函数调用它。构造函数不应该真正打开一个文件并基于该文件创建内容;对于构造函数来说,这太多了。

    非常感谢,我想我创建了一个递归构造函数,我专注于我的while循环,但没有看到这一点。这就解决了我的问题,我将在5分钟内接受答案:)非常感谢,我想我创建了一个递归构造函数,我专注于我的while循环,但没有看到这一点。这解决了我的问题,我将在5分钟内接受答案:)