Здравствуйте, 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
// ... красота на любом уровне "вложенности"! ...
Теперь вы видите?
"Да прозреет ослепший, да избавится от химер и иллюзий ложных." — © Я