MethodImplOptions.AggressiveInlining如果一个昂贵的参数没有被使用,它能阻止它被评估吗?

内联在这里没有帮助

你现在的代码是

void Log(string message, LogLevel logLevel) {
    if (logLevel >= chosenLogLevel)
        Console.WriteLine(message);
}

void Foo()
{
    Log(SlowFunction(), someLogLevel);
}

内联后变为:

void Foo()
{
    var message = SlowFunction();
    var logLevel = someLogLevel;
    if (logLevel >= chosenLogLevel)
        Console.WriteLine(message);
}

logLevel可以进一步内联,但根据定义,必须在检查之前调用SlowFunction()


避免这种情况的一种方法是将message传递为Func<string>

void Log(Func<string> message, LogLevel logLevel) {
    if (logLevel >= chosenLogLevel)
        Console.WriteLine(message());
}

void Foo()
{
    Log(SlowFunction, someLogLevel);
}
posted @ 2022-12-15 23:47  China Soft  阅读(94)  评论(0编辑  收藏  举报