Я разрабатываю и поддерживаю большое (500k + LOC) приложение WinForms, написанное на С# 2.0. Он многопользовательский и в настоящее время развернут примерно на 15 машинах. Развитие системы продолжается (можно считать бесконечной бета-версией), и очень мало сделано для защиты пользователей от потенциальных новых ошибок, которые могут быть введены в еженедельную сборку.
По этой причине, среди прочего, я нашел себя очень зависимым от редактирования и продолжения в отладчике. Это помогает не только с поиском ошибок и исправлением ошибок, но в некоторых случаях и с продолжающимся развитием. Мне очень полезно иметь возможность запускать вновь написанный код из контекста запущенного приложения - нет необходимости перекомпилировать и добавить определенную точку входа в новый код (чтобы добавить фиктивные параметры меню, кнопки и т.д., Чтобы приложение и помня, чтобы удалить их перед следующей сборкой) - все можно попробовать и протестировать в режиме реального времени, не останавливая процесс.
Я занимаюсь редактированием и продолжением с таким высоким уважением, что я активно пишу код, который полностью совместим с ним. Например, я избегаю:
- Анонимные методы и встроенные делегаты (если полностью невозможно переписать)
- Общие методы (кроме стабильного, неизменяемого кода утилиты)
- Ориентация проектов на "Любой процессор" (т.е. никогда не выполняется в 64-разрядной версии)
- Инициализация полей в точке объявления (инициализация перемещается в конструктор)
- Запись блоков перечислителя, которые используют
yield
(кроме кода полезности)
Теперь я полностью понимаю, что новые функции языка в С# 3 и 4 в значительной степени несовместимы с редактированием и продолжением (лямбда-выражения, LINQ и т.д.). Это одна из причин, почему я сопротивлялся переходу проекта на более новую версию Framework.
Мой вопрос заключается в том, является ли хорошей практикой избегать использования этих более продвинутых конструкций в пользу кода, который очень, очень легко отлаживается? Есть ли легитимность в таком развитии, или это расточительно? Кроме того, важно, чтобы какая-либо из этих конструкций (лямбда-выражения, анонимные методы и т.д.) Несли накладные расходы на производительность/память, которые мог бы избежать хорошо написанный, редактируемый и продолжаемый код?... или сделать внутреннюю работу компилятора С#, чтобы такие расширенные конструкции выполнялись быстрее, чем написанный вручную "расширенный" код?