Call Action delegate in C#

Viewed 138

In .NET Core Logging LoggerMessage.cs

method Define<T1>(...) is defined like:

public static Action<ILogger, T1, Exception> Define<T1>(LogLevel logLevel, EventId eventId, string formatString)
{
    var formatter = CreateLogValuesFormatter(formatString, expectedNamedParameterCount: 1);

    void Log(ILogger logger, T1 arg1, Exception exception)
    {
        logger.Log(logLevel, eventId, new LogValues<T1>(formatter, arg1), exception, LogValues<T1>.Callback);
    }

    return (logger, arg1, exception) =>
    {
        if (logger.IsEnabled(logLevel))
        {
            Log(logger, arg1, exception);
        }
    };
}

Can anybody explain me what is the benefit of creating local function Log(ILogger logger, T1 arg1, Exception exception) ?

and what is the difference if method Define<T1>(...) would be defined without the local Log function, like this:

public static Action<ILogger, T1, Exception> Define<T1>(LogLevel logLevel, EventId eventId, string formatString)
{
    var formatter = CreateLogValuesFormatter(formatString, expectedNamedParameterCount: 1);

    return (logger, arg1, exception) =>
    {
        if (logger.IsEnabled(logLevel))
        {
            logger.Log(logLevel, eventId, new LogValues<T1>(formatter, arg1), exception, LogValues<T1>.Callback);
        }
    };
}

Are there any performance reasons?

0 Answers
Related