Тут идея в использовании сопоставление с образцом в условиях.
Правда вышла небольшая накладочка и не всегда можно просто заменить if на switch:
string? F() { return""; }
public int M2()
{
if (F() is object o && o.GetHashCode() == 1)
{
return 1;
}
else if (F() is {} s)
{
return s.Length;
}
else
{
return 2;
}
}
public int M2()
{
return F() switch
{
object o when o.GetHashCode() == 1 => 1, // && или and не подходят
{} s => 1,
_ => 2
};
}
A>var vehicle = TryGetBicycle() ?? TryGetMotorcycke() ?? TryGetCar();
A>
Вот кстати да, всё не мог вспомнить, прямо дежа-вю. Точно, вот оно: полезность этого нововведения мне сильно напоминает позезность оператора "??", тоже были рассказы как теперь заживём по-новому и вах как все смогут писать код типа:
Console.WriteLine("The owner is {0}.", TryGetBicycle()?.Owner ?? TryGetMotorcycle()?.Owner ?? GetDefaultValue().Owner);
И прямо сердце замирало от открывшихся перспектив и причастности к великому...
За пределами демонстраций/обучающих сессий эта конструкция мне понадобилась примерно никогда, конечно. :D
с ?. удобно, если нужно пробраться в какую-то иерархию, где на любом уровне может быть null:
var value = root?.child1?.child2;
if (value != null)
{
...
}
без этого пришлось бы много if городить, а так это компилятор сделает и код чище выглядит.
Удобно при разборе всяких xml, json и т.п. где нельзя повлиять на наличие какого-либо объекта и не стоит падать, если в файле какой-то элемент потеряли.
Эти операторы, на мой взгляд, вполне неплохая вещь и годный сахар.
Здравствуйте, Max Mustermann, Вы писали:
MM>За пределами демонстраций/обучающих сессий эта конструкция мне понадобилась примерно никогда, конечно.
Всё приходит с опытом. ?? — на самом деле один из самых частоисподьзуемых операторов. Но не для всех, например, при императивном подходе это как козе баян. А вот при функциональном это как диаманд.