set抛出StackOverflowException C#

时间:2015-01-27 01:31:12

标签: c#

我正在尝试获取并将此对象的列表发送到文本文件。文本文件采用以下格式。

name,IDnumber,department,value

这里有很多行,所以我用它来读取它们。 这是读取和写入文件的代码。

    public List<Employee> ReadFile(string fileName) {
        StreamReader fileIn = new StreamReader(fileName);
        fileIn = File.OpenText(fileName);
        List<Employee> list = new List<Employee>();
        string[] test;
        string name;
        string ID;
        string dep;
        string post;

        while (!fileIn.EndOfStream || !File.Exists(fileName)) {

            string inString = fileIn.ReadLine();
            test = inString.Split('#');
            name = test[0];
            ID = test[1];
            dep = test[2];
            post = test[3];
            Employee newEmp = new Employee(name, ID, dep, post);
            list.Add(newEmp);

        }
        fileIn.Close();
        return list;
    }

    public void WriteFile(List<Employee> outList, string file) {

        StreamWriter writeOut = new StreamWriter(file);

        for (int i = 0; i < outList.Count; i++) {

            writeOut.WriteLine(outList[i].name + '#' + outList[i].IDnum + '#' + outList[i].department + '#' + outList[i].position);

        }
        writeOut.close();
    }

这是我班级的代码。错误正在集合中抛出。

public class Employee {

    public string name { get { return name; } set { name = value; } }
    public string IDnum { get { return IDnum; } set { IDnum = value; } }
    public string department { get { return department; } set { department = value; } }
    public string position { get { return position; } set { position = value; } }

    public Employee() {

        name = string.Empty;
        IDnum = string.Empty;
        department = string.Empty;
        position = string.Empty;

    }

    public Employee(string newName, string newID) {

        name = newName;
        IDnum = newID;
        department = string.Empty;
        position = string.Empty;

    }

    public Employee(string newName, string newID, string newDep, string
    newPost) {

        name = newName;
        IDnum = newID;
        department = newPost;
        position = newDep;

    }

}

我不确定是否存在某种格式,我缺少set函数以根据需要运行。这是我要求进出文件的函数。我相信它永远不会出现,所以很可能我是如何导入数据的。

3 个答案:

答案 0 :(得分:5)

这是一个非常普遍的问题......一个C#的通过仪式!

让我们来看看单个属性(这适用于所有属性) ...

public string name { get { return name; } set { name = value; } }

那么当您尝试myObj.name = "foo";时会发生什么?

set方法中,您将引用相同的属性name。所以它试图访问name,它再次出现(再次,再次,递归,直到你StackOverflow)。

具有正确命名约定的支持字段是这里的标准:

private string name;
public string Name{get { return name; } set{ name = value; }}

甚至更好,如果没有涉及逻辑,auto-property

public string Name{ get; set; }

答案 1 :(得分:2)

你一直在反复地调用IDnum 和其他属性,直到堆栈溢出

public string IDnum { get { return IDnum; } set { IDnum = value; } }

当您执行类似

的操作时
IDnum = someValue;

调用IDnum的setter,它运行setter中的代码

IDnum = value

反过来调用IDnum的setter,直到你用完堆栈。

修复

在您的情况下,您似乎可以使用自动属性

public string IDnum { get; set; }

答案 2 :(得分:0)

你应该改变

public string name { get { return name; } set { name = value; } }
public string IDnum { get { return IDnum; } set { IDnum = value; } }
public string department { get { return department; } set { department = value; } }
public string position { get { return position; } set { position = value; } }

public string name { get; set; }
public string IDnum { get; set; }
public string department { get; set; }
public string position { get; set; }

或介绍支持领域:

private string _name;
public string name { get { return _name; } set { _name = value; } }

有关C#中自动实现的属性的详细信息,请参阅https://msdn.microsoft.com/en-us/library/bb384054.aspx

请注意,常用的公共属性命名是PascalCasing。您在PascalCasing中的属性如下所示:

public string Name { get; set; }
public string IdNum { get; set; }
public string Department { get; set; }
public string Position { get; set; }