Делегат Call Action в C# - PullRequest
       3

Делегат Call Action в C#

3 голосов
/ 01 августа 2020

In. NET Core Logging LoggerMessage.cs

Метод Define<T1>(...) определяется как:

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

Может ли кто-нибудь объяснить мне, в чем преимущество создания локальной функции Log(ILogger logger, T1 arg1, Exception exception)?

и в чем разница, если бы метод Define<T1>(...) был бы определен без локальной функции Log, например:

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

Есть ли какие-нибудь причины производительности?

...