Что является настолько большим о Func <> делегат?

Если мы используем в веб-приложении java следующие вещи, java-код можно исключить из переднего плана JSP.

  1. Использовать архитектуру MVC для веб-приложения
  2. Использовать Теги JSP a. Стандартные теги b. Пользовательские теги
  3. Язык выражения
25
задан 26 November 2008 в 04:59
поделиться

4 ответа

Величие находится в установлении совместно использованный язык для лучшей коммуникации .

Вместо того, чтобы определить Ваши собственные типы делегата для того же самого (взрыв делегата), используйте тех предоставленных платформой. Любой читающий Ваш код немедленно схватывает то, что Вы пытаетесь выполнить.. минимизирует время к, 'что на самом деле делает эта часть кода?' Поэтому, как только я вижу

  • Действие = некоторый метод, который просто делает что-то и не возвращает вывода
  • Сравнение = некоторый метод, который сравнивает два объекта того же типа и возвращает интервал, чтобы указать, что порядок
  • Преобразователь = преобразовывает Obj в эквивалентный Obj B
  • EventHandler = ответ/обработчик на событие, сгенерированное некоторым объектом, учитывая некоторый вход в форме аргумента события
  • Func = некоторый метод, который берет некоторые параметры, вычисляет что-то и возвращает результат
  • , Предикат = оценивает входной объект против некоторых критериев и состояния передачи/сбоя возврата как bool

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

Правовая оговорка: Лично мне нравится это перемещение разработчиками языка.

Контрдовод : Иногда определение Вашего делегата может помочь передать намерение лучше. например, System.Threading.ThreadStart [более чем 111]. Так it’s личный выбор в конце.

64
ответ дан Timwi 15 October 2019 в 14:54
поделиться

Func семья делегатов (и их return-type-less кузены, Action) не так больше, чем ничто больше, что Вы нашли бы в платформе.NET. Они просто там для повторного использования, таким образом, Вы не должны переопределять их. У них есть параметры типа для хранения вещей универсальными. Например, Func< T0, bool> совпадает с Системой. Predicate< T> делегат. Они были первоначально разработаны для LINQ.

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

Случаи, где необходимо было бы абсолютно определить типы делегата, включают методы, которые принимают больше чем 4 аргумента, методы с , касательно , или параметрические усилители параметры или рекурсивные сигнатуры методов (например, delegate Foo Foo(Foo f)).

12
ответ дан Mark Cidade 15 October 2019 в 14:54
поделиться

В дополнение к корректному ответу Marxidad:

  • стоит знать о связанной с Func семье, Action делегаты. Снова, это типы, перегруженные количеством параметров типа, но объявленные возвратиться пусто.
  • , Если Вы хотите использовать Func/Action в.NET 2,0 проекта, но с простым маршрутом к обновлению позже, можно вырезать и вставить объявления от моего страница сравнения версий. Если Вы объявите их в System пространство имен тогда, то Вы будете в состоянии обновить только путем удаления объявлений позже - но тогда Вы не будете в состоянии (легко) создать тот же код в.NET 3.5 без удаление объявлений.
9
ответ дан Jon Skeet 15 October 2019 в 14:54
поделиться

Разделение зависимостей и нечестивых связей - единственная особенность, которая делает его великим. Все остальное можно оспаривать и утверждать, что это выполнимо доморощенным способом.

Я проводил рефакторинг немного более сложной системы со старой тяжелой библиотекой и был заблокирован из-за невозможности разорвать зависимость времени компиляции - из-за того, что именованный делегат прятался на «другой стороне». Вся загрузка сборки и отражение не помогли - компилятор откажется просто привести делегат () {...} к объекту, и все, что вы сделаете для его усмирения, не удастся с другой стороны.

Сравнение типов делегата, которое является структурным во время компиляции, становится номинальным после этого (загрузка, вызов). Это может показаться нормальным, пока вы думаете о том, что «моя любимая библиотека будет использоваться вечно и всеми», но она не масштабируется даже для немного более сложных систем. Шаблоны Fun <> возвращают некоторую структурную эквивалентность в мир номинального набора текста. Это то, чего вы не можете достичь, развернув свой собственный.

Пример - преобразование:

class Session ( 
    public delegate string CleanBody();    // tying you up and you don't see it :-)
    public static void Execute(string name, string q, CleanBody body) ... 

в:

    public static void Execute(string name, string q, Func<string> body)

Позволяет полностью независимому коду выполнять вызов отражения, например:

Type type = Type.GetType("Bla.Session, FooSessionDll", true); 
MethodInfo methodInfo = type.GetMethod("Execute"); 

Func<string> d = delegate() { .....}  // see Ma - no tie-ups :-)
Object [] params = { "foo", "bar", d};
methodInfo.Invoke("Trial Execution :-)", params);

Существующий код не замечает разницы, новый код не получает зависимости - мир на Земле: - )

7
ответ дан 28 November 2019 в 17:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: