Я недавно смотрел F #, и, хотя я вряд ли скоро скачу забор, он определенно выделяет некоторые области, где C# (или поддержка библиотеки) может облегчить жизнь.switch/pattern matching idea
В частности, я думаю о возможности сопоставления шаблонов F #, что позволяет использовать очень богатый синтаксис - гораздо более выразительный, чем текущий эквивалент C# или условный эквивалент C#. Я не буду пытаться дать прямой пример (мой F # не до него), но в общем она позволяет:
- матч по типу (с полным охватом проверки для дискриминированных союзов) [отметить это также выводит тип связанной переменной, давая доступ к членам и т.д.]
- матч по предиката
- комбинации выше (и, возможно, некоторые другие сценарии, я не в курсе)
Хотя это было бы замечательно для C#, чтобы в конечном итоге занять [гм] некоторые из этого богатства, тем временем я смотрел, что можно сделать т во время выполнения - например, это довольно легко сколотить несколько объектов, чтобы:
var getRentPrice = new Switch<Vehicle, int>()
.Case<Motorcycle>(bike => 100 + bike.Cylinders * 10) // "bike" here is typed as Motorcycle
.Case<Bicycle>(30) // returns a constant
.Case<Car>(car => car.EngineType == EngineType.Diesel, car => 220 + car.Doors * 20)
.Case<Car>(car => car.EngineType == EngineType.Gasoline, car => 200 + car.Doors * 20)
.ElseThrow(); // or could use a Default(...) terminator
где getRentPrice является Func < Vehicle, внутр >.
[Примечание - может быть, Переключитесь/Дело здесь неправильные термины ... но он показывает идею]
Для меня, это намного чище, чем эквивалент с использованием повторена, если/другое, или композитный тройная условный (который становится очень грязным для нетривиальных выражений - скобки в изобилии). Он также избегает лота литья и позволяет простое расширение (прямо или через методы расширения) для более конкретных совпадений, например сравнение InRange (...), сопоставимое с выбором VB ... Case x Для использования ".
Я просто пытаюсь оценить, думают ли люди, что существует много преимуществ от конструкций, подобных приведенным выше (при отсутствии поддержки языка)?
Примечание дополнительно, что я играл с 3-мя варианты выше:
- Func < TSource, TValue > версии для оценки - сравнимая с композитными трехкомпонентными условными операторами
- действия, <TSource> версия - сопоставима с if/else if/else if/else if/else
- a Выражение < Func < TSource, TValue > > версия - как первый, но использоваться произвольными поставщиками LINQ
Кроме того, с помощью Expression на основе версии позволяет Expression-дерево переписывание, по существу, встраивание всех ветвей в единое составное условное выражение, а не при помощи повторным призывание. Я недавно не проверял, но в некоторых ранних сборках Entity Framework я, похоже, напоминаю, что это необходимо, так как это не очень понравилось InvocationExpression. Он также позволяет более эффективно использовать LINQ-to-Objects, поскольку он избегает повторных вызовов делегатов - тесты показывают совпадение, подобное приведенному выше (с использованием формы выражения), выполняющееся с одинаковой скоростью [на самом деле быстрее] по сравнению с эквивалентным C# составной условный оператор.Для полноты версия Func <...> взяла в 4 раза длиннее условного оператора C#, но все еще очень быстро и вряд ли станет основным узким местом в большинстве случаев использования.
Я приветствую любые мысли/ввод/критику/и т. Д. Выше (или о возможностях более богатой поддержки языка C# ... здесь надеется; -p).
Вы можете использовать VB .NET, который поддерживает это в своем заявлении о выборе. Ик! – 2008-11-12 08:01:48
Мне нравится эта идея, и она делает очень приятную и более гибкую форму коммутационного футляра; однако, разве это не действительно украшенный способ использования синтаксиса Linq, как if-then wrapper? Я бы не хотел, чтобы кто-то использовал это вместо реальной сделки, т. Е. Заявление `switch-case`. Не поймите меня неправильно, я думаю, что это место, и я, вероятно, буду искать способ реализации. – IAbstract 2010-12-18 15:44:10
Если вы пишете нечто большее, чем привет-мир с активными шаблонами (F # 3.0), я думаю, это подтолкнет вас к краю ... – 2014-07-11 10:50:06