Разница между отложенным выполнением и отложенной оценкой в ​​C # - PullRequest
11 голосов
/ 27 марта 2010

Не могли бы вы дать мне знать, каково точное различие между отложенным выполнением и отложенной оценкой в ​​C #? Эти два используются как синонимы. Кто-нибудь, пожалуйста, объясните разницу на примере ??

Ответы [ 2 ]

23 голосов
/ 27 марта 2010

На практике они значат одно и то же. Однако предпочтительно использовать термин deferred .

  • Ленивый означает «не выполняйте работу, пока вам не придется».

  • Отложено означает "не вычислять результат, пока вызывающий абонент фактически не использует его."

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

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

Пожалуйста, используйте термин отложено при обсуждении вопроса, поскольку он относится к C #. Lazy - более туманная версия.

Примечание: Ленивый выполнение / оценка отличается от ленивого загрузка или выборка в контексте последовательности . Ленивая загрузка и Готовая загрузка - это термины, используемые для описания того, как загружаются элементы последовательности. Когда последовательность загружается лениво , это означает, что все, что генерирует последовательность, выполняет достаточно работы для загрузки одного элемента за один раз . Когда последовательность загружена с нетерпением , последовательность вся загружается сразу и сохраняется в локальном буфере. Различные требования к использованию требуют разных моделей загрузки.

1 голос
/ 04 июля 2018

В процессе отложенной / ленивой оценки одинаковы.

LINQ-запросы используют ленивую (или отложенную) оценку, фактически не извлекая никаких данных, пока не будет использован результат.

В c # Отложенная / отложенная оценка выполняет тот же процесс, запрос не выполняется, пока он не будет запрошен.

Ex:

DataContext context = new DataContext(); 
 var query = from customer in context.Customers   
            where customer.City == "Delhi"  
            select customer; // Query does not execute here, it wont fetch                           
                              to database to retrieve data   

foreach (var Customer in query) // Query executes here  
{  
   Console.WriteLine(Customer.Name);  
}

Выполняется только в том случае, если используются немедленные выполнения, такие как функции проекции / агрегирования .etc. Пример:

 DataContext context = new DataContext(); 
        var query = (from customer in context.Customers 
         where customer.City == "Delhi" 
        select  customer).Count(); // Query execute here

.Count (), который немедленно запускает и выполняет запрос.

...