C # Func <> делегаты в библиотеке - PullRequest
8 голосов
/ 28 июня 2011

Универсальные делегаты Func <> и Action <> из более поздних версий .NET очень привлекательны, и во многих местах было продемонстрировано, что их можно легко воссоздать в коде, ориентированном на .NET 2.0, например здесь .

Однако, с точки зрения библиотеки, ориентированной на .NET 2.0, которая может использоваться приложениями, созданными для любой более высокой версии .NET, как это складывается. Является ли реализация этого «уровня совместимости» внутри библиотеки абсолютным рецептом конфликта (как с точки зрения частного, так и общедоступного интерфейса), или есть ли способы сделать эту работу независимой от целевой структуры, против которой строит приложение-потребитель?

Если это не стартер, было бы лучше либо: А) Определить идентичный набор параметризованных делегатов с разными именами? или же.. Б) Строго придерживаться соглашения .NET 2.0 и определять новые типы делегатов по мере необходимости?

1 Ответ

6 голосов
/ 28 июня 2011

Истина в том, что Func<> и Action<> - это хорошая идея . Они значительно упрощают чтение вашего кода и позволяют избежать ужасного количества грязных шаблонных объявлений делегатов. Вот почему вы хотите использовать их .

Итак, у вас есть действительно привлекательный стиль программирования, который вы хотите использовать. Это стандартная техника, которая теперь используется почти повсеместно, а не по-старому, но вы не можете использовать ее, потому что вы нацелены на устаревшую версию фреймворка. Что делать?

У вас есть три варианта:

  1. Используйте стиль программирования, который обычно использовался до появления функции
  2. Добавьте функцию в свой собственный код по духу, но с неконфликтующими именами
  3. Добавить функцию в ваш собственный код с «настоящими» именами, но в вашем собственном пространстве имен

Использование старого стиля программирования исключает все преимущества, которые мы привыкли ценить благодаря этой функции. Это большая жертва. Но, возможно, все ваши со-разработчики привыкли к этому стилю программирования.

Использование функции с неконфликтующими именами кажется достаточно разумным. Люди смогут читать код и получать выгоду от функций, но никто не будет смущен тем, что они кажутся чем-то, чем они не являются. Когда вы, наконец, будете готовы к обновлению, вам придется исправить имена. К счастью Ctrl + R, Ctrl + R делает это очень просто.

Использование функции с теми же именами, что и у стандартной функции, означает, что ваш код может быть нацелен на более старую версию, но, похоже, использует новые функции. Похоже на победу / победу. Но это может привести к путанице, и вы должны быть осторожны, чтобы ваши типы не подвергались воздействию других незнающих сборок, что может вызвать проблемы компиляции на уровне исходного кода. Таким образом, вы должны быть осторожны и четко понимать, что происходит. Но это может работать эффективно.

Вы должны выбрать любой подход, который имеет смысл в вашей ситуации, в зависимости от ваших потребностей. Не существует единого правильного ответа для всех, только компромиссы.

...