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);