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; }
Ситуация с ифами ухудшается, если количество проверок увеличивается. А в сопоставлениях с образцом - просто добавляется одна строчка на проверку.