C#中延迟执行和延迟评估之间的差异

时间:2010-03-27 20:08:26

标签: c# linq-to-nhibernate

请您告诉我C#中延迟执行和延迟评估之间的确切差异是什么?这两个是同义词使用的。可以用一个例子解释一下这个差异吗?

2 个答案:

答案 0 :(得分:23)

在实践中,它们的意思基本相同。但是,最好使用术语 deferred

  • 懒惰表示“在你绝对必须做之前不要做这项工作。”

  • 延期表示“在调用者实际使用之前不要计算结果。”

实际上,当调用者决定使用评估结果(即开始迭代IEnumerable<T>)时,这正是需要完成“工作”的时间点(例如发布查询数据库)。

术语延迟对于实际发生的事情更具体/更具描述性。当我说我 laxy 时,这意味着我避免做不必要的工作;关于真正意味着什么,这是模棱两可的。但是,当我说执行/评估 deferred 时,它实际上意味着我根本没有给你真正的结果,而是你可以用来声明结果的票证。我推迟实际外出并获取该结果,直到您声明

在讨论与C#相关的主题时,请使用术语 deferred Lazy 是一个模糊的版本。

注意:延迟执行/评估与<上传加载获取在< EM>序列。 延迟加载急切加载是用于描述序列元素加载方式的术语。当一个序列 lazily 加载时,这意味着生成序列的任何内容都足以让一次加载一个元素。当一个序列急切加载时,整个序列会立即加载并存储在本地缓冲区中。不同的使用要求需要不同的加载模式。

答案 1 :(得分:1)

进行中的延迟/延迟评估相同。

LINQ查询使用惰性(或延迟)评估,直到使用结果后才实际获取任何数据。

在c#延迟/延迟评估中,执行相同的过程,只有在请求查询后才执行查询。

例如:

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);  
}

仅当使用立即执行(例如投影/聚合函数等)时,它才会执行。 例如:

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

.Count()可以立即触发并执行查询。