2011-12-31 161 views
3

我的程序有幾個類和2個表單。我的第一個表單「Main」有一個按鈕,它將顯示第二個窗體「formSettings」和一個打開日誌文件的按鈕。如何知道某個類是否可以用作靜態類?

FormSettings formSettings = new FormSettings(); 
LogClass objectLog = new LogClass(); 

public void settingsToolStripMenuItem1_Click(object sender, EventArgs e) 
    { 
     //shows the settings form 
     formSettings.Show();    
    } 


private void viewLogToolStripMenuItem1_Click(object sender, EventArgs e) 
    {    
     try 
     { 
      objectLog.OpenLogFile(); 
     } 
     catch (Exception ee) 
     { 
      objectMessageBox.ReturnErrorOpeningLogPrompt(ee.ToString()); 
     } 
    } 

我的主要形式創造了兩者的設置形成實例,以及Log類。我的設置類也創建了Log對象的一個​​實例。我現在遇到的問題是,log類根據設置類中的條目做了一些驗證,但是我無法調用設置類的對象,因爲它調用了log類,或者最終導致無限循環。這是它的確認。

public void Write_Log_Data(string data) 
    { 
     //Create an outfile stream 
     FileStream outfile = new FileStream(fileLocation, 
      FileMode.Append, FileAccess.Write); 
     StreamWriter writer = new StreamWriter(outfile); 

     if (objectSettings.chbxLogScanResults.Checked == true) 
     { 
      if (data == null || data == "") 
      { 
       //this is for logging ip addresses 
       writer.WriteLine(Properties.Settings.Default.IPAddressNew + CONST_TAB + 
        GetDateTime()); 

      } 
      //because logs containing errors or changed ips are not null data they trigger this section 
      else 
      { 
       //the error was already formatted so just write it 
       writer.WriteLine(data); 
      } 

      //close our writers 
      writer.Close(); 
      outfile.Close(); 
     } 
    } 

我想知道的是日誌文件應該是靜態的嗎?它可以是靜態的嗎?我希望能夠從任一表單中調用LogClass()方法,它是LogClass的一部分,但如上所示,會根據調用日誌類的某個表單的條目進行檢查。如果我不能使用日誌文件作爲靜態類,我可能會嘗試使用這種方法(我不太瞭解靜態類,因此我的問題)。

回答

2

是的,LogClass絕對可以是靜態的,事實上,如果它是從多個位置訪問的,它可能會更好。

但是,您將需要更改窗體設置如何傳送到日誌類。您需要將靜態屬性添加到日誌類來存儲表單中的值,或者您需要將表單中的值傳遞到日誌類中的方法。例如,如果您的用戶在設置表單中清除了chbxLogScanResults,那麼您可以立即使用此信息更新LogClass,或者保存設置表單(我喜歡在保存時這樣做,以便用戶取消對錶單的更改,您不會錯誤地記錄首選項)。

2

靜態類只是一個類,其成員都是靜態的。沒有什麼特別的。

你應該有一個靜態的,全局可見的日誌工具,它只是委託給一個實際工作的實例化工具。

日誌代碼應該能夠使用默認設置,以便在加載設置之前使其工作。

最後一點:開放FileStream S和一個if()語句之前StreamWriter秒,關閉它們的if()聲明的體內,是一個可怕的想法。考慮使用using關鍵字代替。

相關問題