2010-08-15 2 views
1

프로그램을 작성한 후 단추를 누르면 프로그램이 충돌합니다. 여기 버튼의 코드입니다 :StackOverFlow on 응용 프로그램 시작 지점

Debuging에 유래를 (위치는 주석에 표시되어 있습니다), 여기에 전체 코드 반환
  _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

당신의 게터 내에서 속성을 호출하여 속성 :

무한 재귀가 발생
public DataTable _alRecord 
{ 
    get 
    { 
     if (_alRecord == null) // <= whoops 

- 그것은 null를 돌려줍니다 있는지 확인하기 위해 재산의 취득 메소드 호출은 볼 수있는 속성의 게터를 호출 반환 값이 null 인 경우에는 속성 getter가 호출됩니다.

@Dave는 주석에 좋은 점을 제시합니다. C#에서는 속성이 CasedLikeThis이고 뒷 필드 (where 필드는 null)가 사용되는 것이 일반적입니다. 속성은 실제로 값을 저장합니다 _namedLikeThis입니다. 구별하기가 더 쉽습니다. 항상은 역행 필드를 의미하며, 그 반대의 경우도 마찬가지입니다.

+1

추가 할 것입니다. 더 명료하게 만드는 명명 규칙을 사용하는 것이 좋습니다. 포스터에는 컨벤션이있는 것처럼 보이지만 일반적으로 수행되는 작업에서 거꾸로 진행됩니다. 밑줄은 일반적으로 private 멤버 변수를 나타내는 반면 CapitalizedFirstLetters는 일반적으로 속성에 사용됩니다. –

+0

둘 다 감사합니다.) –