C# MethodImpleOptions.AggressiveInline是否可以防止在不使用昂贵参数的情况下对其求值?
假设我有一个函数日志: 我用一个昂贵的参数来调用它:C# MethodImpleOptions.AggressiveInline是否可以防止在不使用昂贵参数的情况下对其求值?,c#,C#,假设我有一个函数日志: 我用一个昂贵的参数来调用它: Log(SlowFunction(), someLogLevel); 如果我将MethodImplOptions.aggressiveinline应用于日志,那么如果日志级别小于chosenLogLevel,是否会调用SlowFunction?这里的内联没有帮助 您当前的代码是 无效日志字符串消息,日志级别日志级别{ 如果logLevel>=chosenLogLevel Console.WriteLinemessage; } 福娃 { Lo
Log(SlowFunction(), someLogLevel);
如果我将MethodImplOptions.aggressiveinline应用于日志,那么如果日志级别小于chosenLogLevel,是否会调用SlowFunction?这里的内联没有帮助
您当前的代码是
无效日志字符串消息,日志级别日志级别{
如果logLevel>=chosenLogLevel
Console.WriteLinemessage;
}
福娃
{
LogSlowFunction,someLogLevel;
}
内联后,它变成:
福娃
{
var消息=慢功能;
var logLevel=someLogLevel;
如果logLevel>=chosenLogLevel
Console.WriteLinemessage;
}
然后可以进一步内联logLevel,但必须在检查之前根据定义调用SlowFunction
避免这种情况的一种方法是将消息作为Func传递:
无效LogFunc消息,日志级别LogLevel{
如果logLevel>=chosenLogLevel
Console.WriteLinemessage;
}
福娃
{
LogSlowFunction,someLogLevel;
}
是的,参数值计算在调用方法之前在调用站点进行。只有[Conditional]可以阻止这种情况发生,但在这里对您没有帮助,因为someLogLevel是一个变量。你需要一个if语句来获得成功。已经做了,没什么大不了的。
Log(SlowFunction(), someLogLevel);