2010-08-15 63 views
1

我建立了一个程序,并且我按了一个按钮,程序崩溃了。 这里是按钮的代码:StackOverFlow在应用程序的开始点

  _alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema); 

调试运行返回计算器(位置被标记在评论),这里是整个代码:

 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); 
    } 

回答

4

您从getter中调用你的财产你属性:

public DataTable _alRecord 
{ 
    get 
    { 
     if (_alRecord == null) // <= whoops 

这将导致无限递归 - 调用属性的getter以查看它是否返回null调用属性的getter来查看如果它返回null调用该属性的吸气...

@Dave在评论中提出了一个很好的观点 - 在c#中使用一个命名约定是很常见的,你的属性是CasedLikeThis和支持字段该物业实际存储的价值是_namedLikeThis。它使分辨更容易 - 你知道总是 _表示支持字段,反之亦然。

+1

我会补充一点 - 有一个命名约定使得这一点更加明显是件好事。看起来海报有一个约定,但是它通常会做的倒退。下划线_usually表示一个私有成员变量,而CapitalizedFirstLetters通常用于属性。 – 2010-08-15 13:40:14

+0

谢谢你们俩=) – 2010-08-15 13:43:15