2011-12-31 244 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关键字代替。

相关问题