Вопрос

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

Я нахожусь в проекте, который предполагает, что мне нужно изучить ряд новых (для меня) технологий, включая LINQ (для ОБЪЕКТОВ и XML для целей этого проекта) и другие.Все, что я прочитал до этого момента, говорит о том, что для использования LINQ мне нужно полностью понимать следующее (делегаты, анонимные методы и лямбда-выражения).

Ладно, теперь начинается самое интересное.Я использовал делегаты в прошлом, когда работал с моделью сетевых событий .Но большинство деталей были скрыты от меня (спасибо Microsoft!).Я понимаю, что на базовом уровне экземпляры делегирования являются указателями на методы (я знаю, это грубое упрощение).

Я понимаю, что анонимный метод - это, по сути, встроенный безымянный метод, обычно (если не исключительно) создаваемый в качестве целевого объекта для делегата.

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

Простите меня, если какое-либо из моих описаний здесь не соответствует действительности, это базовый уровень, на котором я разбираюсь в этих темах.

Итак, задача:

  1. Кто-нибудь может сказать мне, хотя бы на базовом уровне, близко ли мое понимание этих предметов?Я не ищу сложных эзотерических подробностей, только основы (на данный момент).

  2. В какой степени мне нужно по-настоящему понять эти концепции, прежде чем применять LINQ в проекте с разумным эффектом?Я хочу понять это полностью и готов потратить на это время.У меня просто может не хватить времени полностью разобраться со всем этим материалом, прежде чем мне нужно будет произвести какую-то работу.

  3. Может ли кто-нибудь указать мне на несколько хороших статей, объясняющих эти темы и применяющих их к примерам из "реального мира", чтобы я мог разобраться в основах тем и их применении?Что я подразумеваю под реальным миром, так это то, как я мог бы использовать это в контексте "Клиентов и счетов", а не абстрактных "Векторов и фигур" или "Животных и коров".Сценарий может быть несколько надуманным для демонстрационных целей, но, надеюсь, не строго академическим.Я нашел несколько примеров в Интернете и в книгах, но лишь немногие из них кажутся объяснениями на "простом английском".

Заранее благодарю вас всех за ваше терпение, время и опыт.

Это было полезно?

Решение

1) Эти описания кажутся мне довольно точными.Иногда анонимным методам и лямбда-выражениям потребуется создать новый тип для указания целевого объекта делегата, чтобы они могли действовать как закрытия.

2/3) Я бы немного почитал, пока вы не будете довольны делегатами, анонимными методами и лямбда-выражениями.Я посвящаю главу подробному описанию изменений, связанных с делегированием, в C # C # 2.0 и C # 3.0 в C #, хотя, конечно, другие книги тоже посвящены деталям.У меня есть Статья как хорошо, если это поможет.

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

  • Предоставление кода для вызова при запуске нового потока
  • Реагирование на события пользовательского интерфейса
  • Предоставление фильтра, выбора, упорядочивания и т.д. Для запроса LINQ
  • Предоставление обратного вызова по завершении асинхронной операции

Если у вас есть какие-то конкретные ситуации, на которые вы хотели бы привести пример, на это было бы легче ответить.

Редактировать:Я должен отметить, что хорошей новостью является то, что на данный момент вы работаете только с LINQ to Objects и LINQ to XML, поскольку это означает, что вам пока не нужно разбираться в деревьях выражений.(Они классные, но шаг за шагом...) LINQ to XML - это на самом деле просто XML API, который прекрасно работает с LINQ - насколько я помню, вы будете использовать делегаты с LINQ to XML только тогда, когда вы фактически вызываете LINQ to Objects.(По общему признанию, это очень приятно делать, но это означает, что вы можете повторно использовать то, чему уже научились.)

Поскольку вы уже подробно изучили C #, в главах 10 и 11 приведено довольно много примеров используя лямбда-выражения (и выражения запроса, которые преобразуются в лямбда-выражения) в LINQ.В главе 5 приведено несколько различных примеров использования делегирования.

Другие советы

Где я могу найти хорошее подробное руководство по C # 3?

1) Ваши знания пока кажутся нормальными.Лямбда-выражения преобразуются в анонимные методы или System.Linq.Выражения.Выражения, в зависимости от контекста.Поскольку вы не используете технологию базы данных, вам не нужно понимать выражения (все лямбды будут анонимными методами).Вы не перечислили методы расширения, но они очень важны (и просты) для понимания.Убедитесь, что вы видите, как применить метод расширения к интерфейсу, поскольку вся функциональность в linq поступает из System.Linq.Enumerable - набор методов расширения для IEnumerable (из T).

2) Вам не нужно глубокое понимание лямбд.

Синтаксис стрелки ( => ) был для меня самым большим препятствием.Стрелка разделяет подпись и тело лямбда-выражения.

Всегда помни : Методы Linq не выполняются до тех пор, пока не будут перечислены.

Следите за использованием переменные цикла в лямбде.Это побочный эффект отложенного выполнения, который особенно сложно отследить.

3) Конечно, вот некоторые из моих ответов, которые показывают вызовы метода linq - некоторые с использованием xml.

Прочитайте это ...

http://linqinaction.net/

.. и на все ваши вопросы ответят !!!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top