gpt4 book ai didi

c# - 条件记录的便捷方式

转载 作者:太空宇宙 更新时间:2023-11-03 12:42:17 25 4
gpt4 key购买 nike

日志正在占用资源。特别是创建日志消息。为了节省运行时资源,我这样做:

if (logFile!=null) Log(logFile, "Some Message "+someMethod());

它消除了在不需要日志记录时调用 someMethod。

有没有更方便的编码方式?喜欢

Logger.logger?.Log("Some Message "+someMethod());

记录器是静态类,记录器是委托(delegate)...不幸的是它在我的 VS2012 中不起作用。

更新:这个问题的主要目的是如何简化代码的外观和减少运行时的开销。在我原来的方法中,如果不需要日志记录,则不会调用 someMethod(),但代码保持不变。检查 null 只是避免调用额外方法的建议方法。

更新2:一些例子:

    public class Example {      
public class Logger
{
public static void Log(string message)
{
Console.WriteLine(message);
}
}

public static Logger logger;

public static void Test()
{
// has compilation error "Invalid expression term '.'
logger?.Log("This "+"should "+"be "+"not invoked");
logger = new Logger();
logger?.Log("This should "+"be logged");
}
}

最佳答案

你能把 null 检查包装在静态类中吗?您不必直接调用委托(delegate)。

例如

public class Logger
{
public Action<string> LogAction { get;set; }

public void Log(string message)
{
var logAction = LogAction;

if(logAction != null)
logAction(message);
}
}

这将被简单地称为:

Logger.Log("Something happened");

另一种选择是使用 Conditional 属性。

https://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute(v=vs.110).aspx

除非在构建期间提供编译符号,否则不会在编译的 IL 中调用标有该属性的方法。

public static class Logger
{
public static Action<string> LogAction { get;set; }

[Conditional("LoggingEnabled")]
public static void LogConditional(string message)
{
var logAction = LogAction;

if(logAction != null)
logAction(message);
}

public static void Log(string message)
{
var logAction = LogAction;

if(logAction != null)
logAction(message);
}
}

Log 方法没有条件属性,因此以下代码生成以下 IL:

var foo = "foo";
var bar = "bar";

Logger.Log(foo + bar);

IL_0000: nop
IL_0001: ldstr "foo"
IL_0006: stloc.0 // foo
IL_0007: ldstr "bar"
IL_000C: stloc.1 // bar
IL_000D: ldloc.0 // foo
IL_000E: ldloc.1 // bar
IL_000F: call System.String.Concat
IL_0014: call UserQuery+Logger.Log
IL_0019: nop
IL_001A: ret

LogConditional 方法确实具有条件属性,并且尚未设置编译器符号,因此以下代码生成以下 IL:

var foo = "foo";
var bar = "bar";

Logger.LogConditional(foo + bar);

IL_0000: nop
IL_0001: ldstr "foo"
IL_0006: stloc.0 // foo
IL_0007: ldstr "bar"
IL_000C: stloc.1 // bar
IL_000D: ret

如您所见,由于未生成方法调用,因此从未执行字符串连接。

关于c# - 条件记录的便捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38485029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com