gpt4 book ai didi

c# - 如何禁用方法中的参数评估

转载 作者:行者123 更新时间:2023-11-30 15:03:52 26 4
gpt4 key购买 nike

记不住更好的标题,请随时将其更改为更好的标题:)

我的应用程序包含很多日志记录语句,如下所示:

var logger = new Logger(/*..get flag from settings if the logger should be active..*/);
// ....
logger.LogActivity(..serialize an object..);
//...
logger.LogActivity(..get another object's expensive overriden ToString method..);
//...
logger.LogActivity(..log something new..);

记录器类:

public class Logger
{
private readonly bool _isActive;

public Logger(bool isActive)
{
_isActive = isActive;
}

public void LogActivity(string activity)
{
if (_isActive)
{
// Save activity to Database.
}
}
}

当我在设置中禁用记录器时(因此 Logger 类中的 _isActive 字段为 false),则不会将任何内容保存到数据库中。但是 Logger.LogActivity 方法中的所有表达式仍然被评估(例如 ..serialize object.. 在前面的例子中),这会减慢我的应用程序。我可以使用这样的日志语句:

var logger = new Logger(/*..get flag from settings if the logger should be active..*/);
// ....
if (loggerIsActive) logger.LogActivity(..serialize an object..);
//...
if (loggerIsActive) logger.LogActivity(..get another object's expensive overriden ToString method..);
//...
if (loggerIsActive) logger.LogActivity(..log something new..);

但只更改 LogActivity 方法会好得多...是否有可能以某种方式仅更改 LogActivity 方法,以便万一禁用记录器时,不会评估 LogActivity 调用中的表达式?好吧 - 如果这在 C# 中可行,我会感到惊讶,但是还有其他方法/模式可以做到这一点吗?

最佳答案

您可以添加一个以 Func<string> 为参数的重载这将生成要记录的字符串。

public void LogActivity(Func<string> activity)
{
if (_isActive)
{
string log = activity();
// save 'log' to database
}
}

然后像这样使用它:

logger.LogActivity(() => expensiveObject.ToString());

关于c# - 如何禁用方法中的参数评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11117632/

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