我正在尝试获取并将此对象的列表发送到文本文件。文本文件采用以下格式。
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函数以根据需要运行。这是我要求进出文件的函数。我相信它永远不会出现,所以很可能我是如何导入数据的。
答案 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; }