Null Checking параметров в C# 11.0 preview

Уже сейчас можно попробовать фикции, которые будут доступны в C# 11 версии. Среди них есть очень простая, но интересная функция, именуемая "Parameter Null Checking". Давайте посмотрим что это такое и как можно использовать.

Обычно функции, содержащие параметры, которые могут получать null значения, но при отсутствии данных могут работать не корректно, похожи на следующий код:

static string GetAuthorizationString(ServerInformation server, OpenTokenInformation token, User user)
{
    if (server == null)
    {
        throw new ArgumentNullException(nameof(server));
    }
    if (token == null)
    {
        throw new ArgumentNullException(nameof(token));
    }
    if (user == null)
    {
        throw new ArgumentNullException(nameof(user));
    }

    return $"{server.Url}?uat={token.Token}&u={user.Name}";
}

В глаза сразу бросается дублирование проверок параметров. Полезную работу делает только одна строка функции, а 9 строк всего лишь проверки параметров на null.

В .NET 6 было сделано приятное изменение – был добавлен метод ThrowIfNull для ArgumentNullException и стало возможным привести описанную ранее функцию к следующему виду.

static string GetAuthorizationString(ServerInformation server, OpenTokenInformation token, User user)
{
    ArgumentNullException.ThrowIfNull(server);
    ArgumentNullException.ThrowIfNull(token);
    ArgumentNullException.ThrowIfNull(user);

    return $"{server.Url}?uat={token.Token}&u={user.Name}";
}

И всё работает отлично, кода стало гораздо меньше, он стал лучше читаться. Но при этом, если наша функция содержит много параметров, мы всё равно получаем много, по сути, дублирования кода. Который лишь раздувает объем исходных файлов, но без которого всё равно не обойтись.

Но в C# 11 версии разработчики решили заняться этой проблемой и сделали следующее, если параметр функции пометить двумя восклицательными знаками !!, тогда данный параметр будет проверен на null в начале функции, без каких либо дополнительных действий. И в случае если он null, будет выброшен ArgumentNullException.

Ранее описанная функция приобретёт следующий вид:

static string GetAuthorizationString(ServerInformation server!!, OpenTokenInformation token!!, User user!!)
{
    return $"{server.Url}?uat={token.Token}&u={user.Name}";
}

Что, согласитесь, куда легче читается и сами функции выглядят намного проще.

Результат аналогичный тому, если бы мы бросали ArgumentNullException вручную.

На мой взгляд, это отличный функционал, которого давно не хватало в C#. И это одна их тех вещей, которая при минимальных изменениях даёт огромный видимый результат.

Приятного программирования.

Добавить комментарий