C# - pattern matching - many discards
Вопрос про оформление и красивости. И можно ли вообще так написать.
Вобщем, понадобилось проверить объект на кучку разномастных условий. Например, на налл весь объект, на значение одно из свойств, если объект не налл, и вернуть что-то другое, если какие-то ещё условия. И хочу спросить, как удобнее сделать, чтобы не писать простыную из вложенных ифов. Пусть мы получили где-то объект 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;
}
Ситуация с ифами ухудшается, если количество проверок увеличивается. А в сопоставлениях с образцом - просто добавляется одна строчка на проверку.