Deutsch

C# - pattern matching - many discards

20.02.24 16:20
C# - pattern matching - many discards
 
alex445 коренной житель
Последний раз изменено 20.02.24 16:36 (alex445)

Вопрос про оформление и красивости. И можно ли вообще так написать.


Вобщем, понадобилось проверить объект на кучку разномастных условий. Например, на налл весь объект, на значение одно из свойств, если объект не налл, и вернуть что-то другое, если какие-то ещё условия. И хочу спросить, как удобнее сделать, чтобы не писать простыную из вложенных ифов. Пусть мы получили где-то объект row кастомного типа и хотим сделать подобные проверки. Как вы находите такую запись - удобной, читаемой, или лучше пачку вложенных ифов?


var result = row switch
{
    null => MyEnum.NotAllowed,
    _ when row.Age > 100 => MyEnum.Died,
    _ => MyEnum.StillAlive,
};


Тут результат быдет перечислением MyEnum.

Насколько я знаю, все выражения в выражении свича проверяются по порядку написания до первого соответствия, так что первая проверка на налл всего объекта - нормально. Меня смутило только возможность сделать несколько дискардов, т.к. полный объект мне не нужен. Ну или может можно как-то без дискардов обойтись.


Я могу так переписать, но мне что-то первый вариант больше нравится - можно добавить проверок других свойств row, и тогда логично, что входной параметр свича это весь объект. Но в любом случае есть пачка дискардов - не смущает ли она?


var result = row.Age switch
{
    _ when row == null => MyEnum.NotAllowed,
    > 100 => MyEnum.Died,
    _ => MyEnum.StillAlive,
};


Альтернатива в ифах


MyEnum result;
if (row != null)
{
    if (row.Age > 100)
    {
        result = MyEnum.Died;
    }
    else
    {
        result = MyEnum.StillAlive;
    }
}
else
{
    result = MyEnum.NotAllowed;
}


Ситуация с ифами ухудшается, если количество проверок увеличивается. А в сопоставлениях с образцом - просто добавляется одна строчка на проверку.

 

Перейти на