我的程序有一些类和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());
}
}
My Main表单创建Settings表单和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();
}
}
我想知道的是日志文件应该是静态的吗?它可以是静态的吗?我希望能够从任何一种形式调用LogOpen()方法作为LogClass的一部分,但是如上所示,根据调用日志类的其中一个表单的条目进行了一些检查。如果我不能将日志文件用作静态类,那么尝试这个可能是一个很好的解决方案(因此我不太了解静态类)。
答案 0 :(得分:2)
是的,LogClass绝对可以是静态的,事实上,如果从多个位置访问它,它可能更好。
但是,您需要更改表单设置与日志类的通信方式。您将需要向日志类添加静态属性以存储表单中的值,或者您需要将表单中的值传递给日志类中的方法。
例如,如果您的用户在设置表单中清除了chbxLogScanResults,那么您可以立即使用此信息更新LogClass,也可以在保存设置表单时更新(我更喜欢在保存时执行此操作,以便在用户取消时更改表单,您不会错误地记录首选项。)
答案 1 :(得分:2)
静态类只是一个成员都是静态的类。没什么特别的。
您应该拥有一个静态的,全局可见的日志记录工具,它只是委托给一个实际工作的实例。
日志记录代码应该能够使用默认设置,以便在设置加载之前使其正常工作。
最后一点注意事项:在FileStream
语句之前打开StreamWriter
和if()
s,并在if()
语句的正文中关闭它们是个糟糕的主意。请考虑改为使用using
关键字。