跳过设置标志后的代码行

本文关键字:代码 标志 设置 | 更新日期: 2023-09-27 17:49:00

我有一个相当大的程序(c#),需要通过添加一个关闭日志记录的选项来扩展它的功能。该程序将一个目录位置作为参数,用于存储日志。如果args[0]为空,我希望它不记录任何内容。现在程序中嵌套了像这样的行:

DiagnosticLog.WriteLine("'t't----Verifying Plugins were installed correctly----");

我的第一个想法是在该函数中创建并检查全局标志,如果没有设置则运行该行。这样我就可以避免在所有代码的每一行周围使用相同的if语句。有没有更聪明的方法在运行时"关闭"这些行?

跳过设置标志后的代码行

您可以实现一个不记录任何内容的DiagnosticLog版本,如果您不想记录日志,可以使用it来代替您的日志版本。这是假设您知道在创建DiagnosticLog实例时是否要进行日志记录(我从您的询问方式中得知,您确实要进行日志记录)。

如何修改您的DiagnosticLog.WriteLine函数采取第二个参数doActualLog (bool),其默认值为true ?对DiagnoticLog做一些非常小的修改来考虑这个值。然后,您可以在DiagnosticLog实例化时决定是否要进行实际的日志记录。

您可以在默认为trueDiagnosticLog上添加enabled标志。如果args[0]为空,调用DiagnosticLog.Disable()将其设置为false。然后在WriteLine和任何其他日志记录函数中,在进行实际日志记录之前检查enabled

为什么不调用一个日志函数来检查参数是否为空呢?

public void WriteLine(string log) {
    if (!firstArgIsEmpty) {
        // Print to file.
    }
}

如何将System.Diagnostics.TraceListener类与System.Diagnostics.TraceSwitch结合使用?你想要的功能已经在里面了

您可以创建一个属性

public bool Log { get; set; }
string logFilePath;
public string LogFilePath
{
    get { return logFilePath; }
    set 
    {
        logFilePath = ValidateLogFilePath(value);
        Log = logFilePath.Length > 0;
    }            
}
public void WriteLine(string line)
{
    if (!Log)
        return;
    //...
}

如果您使用一个布尔属性来指示是否发生日志记录,那么您还可以使用它来跳过如果不发生日志记录则不需要的其他代码部分。如果你只是为了记录日志而构建长字符串,这可能会很有用。

if (DiagnosticLog.Log)
{
    DiagnosticLog.WriteLine("The following plugins were not installed:'r'n't" +
          string.Join("'r'n't", GetMissingPluginNames()));
}