我构建了一个程序,然后按下一个按钮,程序崩溃了。 这是按钮的代码:
_alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema);
调试返回StackoverFlow(位置在注释中标出),这里是完整代码:
private string alFile = @".\alRecord.xml";
public DataTable alRecord;
public DataTable _alRecord
{
get
{ //location of stackoverflow
if (_alRecord == null)
{
alRecord = new DataTable();
if (File.Exists(alFile))
{ _alRecord.ReadXml(alFile); }
else
{ InitDataTable2(_alRecord); }
}
return _alRecord;
}
}
private void InitDataTable2(DataTable table)
{
table.TableName = "AlTable";
table.Columns.Add("ID", typeof(int));
table.Columns.Add("sun", typeof(bool));
table.Columns.Add("mon", typeof(bool));
table.Columns.Add("tue", typeof(bool));
table.Columns.Add("wed", typeof(bool));
table.Columns.Add("thu", typeof(bool));
table.Columns.Add("fri", typeof(bool));
table.Columns.Add("sat", typeof(bool));
table.Columns.Add("doors", typeof(string));
table.Columns.Add("from1", typeof(DateTime));
table.Columns.Add("to1", typeof(DateTime));
table.Columns.Add("from2", typeof(DateTime));
table.Columns.Add("to1", typeof(DateTime));
for (int i = 0; i < 99; i++)
{
var row = alRecord.NewRow();
row["ID"] = i;
row["sun"] = false;
row["mon"] = false;
row["tue"] = false;
row["wed"] = false;
row["thu"] = false;
row["fri"] = false;
row["sat"] = false;
row["doors"] = "";
row["from1"] = "00:01";
row["to1"] = "23:59";
row["from2"] = "00:01";
row["to2"] = "23:59";
alRecord.Rows.Add(row);
}
}
private void alSave_Click(object sender, EventArgs e)
{
_alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema);
}
最佳答案
您正在从属性的 getter 内部调用您的属性:
public DataTable _alRecord
{
get
{
if (_alRecord == null) // <= whoops
这会导致无限递归 - 调用属性的 getter 以查看它是否返回 null 调用属性的 getter 以查看它是否返回 null 调用属性的 getter ...
@Dave 在评论中提出了一个很好的观点——在 C# 中,通常使用命名约定,你的属性是 CasedLikeThis
和支持字段(属性实际存储其值的字段是_namedLikeThis
。它更容易区分 - 您总是知道 _ 表示支持字段,反之亦然。
关于c# - 应用程序起点上的 StackOverFlow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3487557/