Re[3]: C# - добавили бардака - одобряете?
От: Shtole  
Дата: 11.09.22 12:47
Оценка: +1
Здравствуйте, Caracrist, Вы писали:

C>Могли бы взять синтаксис C++17


C>Получилось бы тоже в одну строчку:

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

C>

Сишарповский вариант лично мне нравится горазо больше.

А почему объявление переменной с инициализацией было не сделать выражением?

if ((var bicycle = TryGetBicycle()) != null)
    Console.WriteLine("Bicycle owner is {0}.", bicycle.Owner);
Do you want to develop an app?
Re[2]: C# - добавили бардака - одобряете?
От: _NN_ www.nemerleweb.com
Дата: 11.09.22 22:14
Оценка: 12 (1) +1
Здравствуйте, Aquilaware, Вы писали:

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


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


Не обязательно так многословно:

if (TryGetBicycle() is {} bicycle) ...
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: C# - добавили бардака - одобряете?
От: _NN_ www.nemerleweb.com
Дата: 11.09.22 22:23
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Получилось бы тоже в одну строчку:

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

C>

Тут идея в использовании сопоставление с образцом в условиях.
Правда вышла небольшая накладочка и не всегда можно просто заменить 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         
        };
    }
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: C# - добавили бардака - одобряете?
От: Aquilaware  
Дата: 11.09.22 22:27
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>
_NN>if (TryGetBicycle() is {} bicycle) ...
_NN>


Короче на пару слов, но вот вообше не понятно что это такое без подьема доки.
Re[4]: C# - добавили бардака - одобряете?
От: _NN_ www.nemerleweb.com
Дата: 11.09.22 22:32
Оценка: +1
Здравствуйте, Aquilaware, Вы писали:

A>Здравствуйте, _NN_, Вы писали:


_NN>>
_NN>>if (TryGetBicycle() is {} bicycle) ...
_NN>>


A>Короче на пару слов, но вот вообше не понятно что это такое без подьема доки.


А я как раз не додумался, что можно писать «is not null and var».
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: C# - добавили бардака - одобряете?
От: Max Mustermann  
Дата: 14.09.22 10:58
Оценка: -1 :)
Здравствуйте, Aquilaware, Вы писали:


A>
A>var vehicle = TryGetBicycle() ?? TryGetMotorcycke() ?? TryGetCar();
A>


Вот кстати да, всё не мог вспомнить, прямо дежа-вю. Точно, вот оно: полезность этого нововведения мне сильно напоминает позезность оператора "??", тоже были рассказы как теперь заживём по-новому и вах как все смогут писать код типа:
Console.WriteLine("The owner is {0}.", TryGetBicycle()?.Owner ?? TryGetMotorcycle()?.Owner ?? GetDefaultValue().Owner);


И прямо сердце замирало от открывшихся перспектив и причастности к великому...
За пределами демонстраций/обучающих сессий эта конструкция мне понадобилась примерно никогда, конечно. :D
Re[5]: C# - добавили бардака - одобряете?
От: karbofos42 Россия  
Дата: 14.09.22 12:23
Оценка: +3
Здравствуйте, Max Mustermann, Вы писали:

MM>За пределами демонстраций/обучающих сессий эта конструкция мне понадобилась примерно никогда, конечно. :D


Ну, с ?? удобно исключения бросать и дефолтные значения задавать:
_value1 = value1 ?? throw new ArgumentNullException(nameof(value1));
_value2 = value2 ?? defaultValue2;


с ?. удобно, если нужно пробраться в какую-то иерархию, где на любом уровне может быть null:
var value = root?.child1?.child2;

if (value != null)
{
...
}

без этого пришлось бы много if городить, а так это компилятор сделает и код чище выглядит.
Удобно при разборе всяких xml, json и т.п. где нельзя повлиять на наличие какого-либо объекта и не стоит падать, если в файле какой-то элемент потеряли.
Эти операторы, на мой взгляд, вполне неплохая вещь и годный сахар.
Re[5]: C# - добавили бардака - одобряете?
От: Aquilaware  
Дата: 19.09.22 17:58
Оценка:
Здравствуйте, Max Mustermann, Вы писали:

MM>За пределами демонстраций/обучающих сессий эта конструкция мне понадобилась примерно никогда, конечно.


Всё приходит с опытом. ?? — на самом деле один из самых частоисподьзуемых операторов. Но не для всех, например, при императивном подходе это как козе баян. А вот при функциональном это как диаманд.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.