您能否让我知道 C# 中延迟执行和延迟评估之间的确切区别是什么?这两者是同义词。有人可以用一个例子来解释一下区别吗?
2 回答
在实践中,它们的含义基本相同。但是,最好使用术语deferred。
懒惰的意思是“在绝对必须做之前不要做工作”。
Deferred的意思是“在调用者实际使用结果之前不要计算结果”。
在实践中,当调用者决定使用评估的结果(即开始迭代 an IEnumerable<T>
)时,这正是需要完成“工作”的点(例如向数据库发出查询)。
延期一词更具体/描述了实际发生的事情。当我说我懒惰时,意思是我避免做不必要的工作;它的真正含义是模棱两可的。然而,当我说执行/评估被推迟时,它本质上意味着我根本没有给你真正的结果,而是一张你可以用来声明结果的票。我推迟实际出去并获得该结果,直到您提出要求。
在讨论与 C# 相关的主题时, 请使用术语deferred 。懒惰是一个模糊的版本。
注意:延迟执行/评估不同于序列上下文中的延迟加载或获取。 延迟加载和急切加载是用于描述如何加载序列元素的术语。当一个序列被延迟加载时,这意味着生成序列的任何东西都只做了足够的工作来一次加载一个元素。当一个序列被急切加载时,整个序列被一次性加载并存储在本地缓冲区中。不同的使用要求需要不同的加载模式。
在进程中延迟/延迟评估是相同的。
LINQ 查询使用惰性(或延迟)评估,在使用结果之前不会实际获取任何数据。
在 c# Deferred/lazy 评估中执行相同的过程,在请求之前不会执行查询。
前任:
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() 立即触发并执行查询。