2010-08-15 4 views
1

J'ai créé un programme, et j'appuie sur un bouton, le programme se bloque. Voici le code du bouton:StackOverFlow sur le point de départ de l'application

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

Déboguer retourné Stackoverflow (emplacement est marqué dans un commentaire), voici le code complet:

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

Répondre

4

Vous appelez votre propriété à l'intérieur du getter de votre propriété:

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

cela provoque une récursion infinie - appeler le getter de la propriété pour voir si elle renvoie la valeur null appelle le getter de la propriété pour voir si elle renvoie null appelle le getter de la propriété ...

@Dave fait un bon point dans les commentaires - dans C# il est courant d'utiliser une convention de dénomination que votre propriété est CasedLikeThis et le champ de support (le champ où la propriété stocke réellement sa valeur est _namedLikeThis. Il est plus facile de distinguer - toujours connaître le champ backing _ means, et vice versa.

+1

Je vais ajouter à cela - il est bon d'avoir une convention de nommage qui rend cela un peu plus évident. On dirait que l'affiche a une convention, mais c'est en arrière de ce qui est habituellement fait. Un caractère de soulignement signifie généralement une variable de membre privé, alors que CapitalizedFirstLetters est généralement utilisé pour les propriétés. –

+0

Merci à vous deux =) –

Questions connexes