Re: C# - добавили бардака - одобряете?
От: Aquilaware  
Дата: 08.09.22 20:35
Оценка: 154 (5) -1 :))
Здравствуйте, Shmj, Вы писали:

S>Не кажется ли это внедрением бардака? В одном месте будут писать так в другом эдак.


Совсем нет, потому что теперь можно сделать вот так в одну строку:

if (GetIQ() is < 100 and > 50)
    Console.WriteLine("Hoi polloi");


Можно даже захватить походящее значение в переменную для дальнейшего использования:

if (GetIQ() is < 100 and > 50 and var iq)
    Console.WriteLine("Hoi polloi IQ: {0}", iq);


Очень удобно. Или например вместо часто используемой проверки на null:

var bicycle = TryGetBicycle();
if (bicycle != null)
    Console.WriteLine("Bicycle owner is {0}.", bicycle.Owner);


это теперь можно делать в одну строку:

if (TryGetBicycle() is not null and var bicycle)
    Console.WriteLine("Bicycle owner is {0}.", bicycle.Owner);


Почему такая возможность важна? Потому что иногда это безумно удобно во вложенных if'ах, так как позволяет обойтись одним уровнем вложенности вместо плохо читаемой "ёлочки" c углублениями.

Например, классика:

var bicycle = TryGetBicycle();
if (bicycle != null)
{
    Console.WriteLine("Bicycle owner is {0}.", bicycle.Owner);
}
else
{
    var motorcycle = TryGetMotorcycle();
    if (motorcycle != null)
    {
        Console.WriteLine("Motorcycle owner is {0}.", motorcycle.Owner);
    }
    else
    {
        var car = TryGetCar();
        if (car != null)
        {
            Console.WriteLine("Car owner is {0}.", car.Owner);
        }
        else
        {
            // ... намученный баян который идет глубоко вниз и конкретно долбит мозг на 5-7-м уровнях вложенности ...
        }
    }
}


Вместо такого ужаса теперь посмотрим на произведение исскуства, на картину Художника:

if (TryGetBicycle() is not null and var bicycle)
    Console.WriteLine("Bicycle owner is {0}.", bicycle.Owner);
else if (TryGetMotorcycle() is not null and var motorcycle)
    Console.WriteLine("Motorcycle owner is {0}.", motorcycle.Owner);
else if (TryGetCar() is not null and var car)
    Console.WriteLine("Car owner is {0}.", car.Owner);
else
    // ... красота на любом уровне "вложенности"! ...


Теперь вы видите?

"Да прозреет ослепший, да избавится от химер и иллюзий ложных." — © Я
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.