请您告诉我C#中延迟执行和延迟评估之间的确切差异是什么?这两个是同义词使用的。可以用一个例子解释一下这个差异吗?
答案 0 :(得分:23)
在实践中,它们的意思基本相同。但是,最好使用术语 deferred 。
懒惰表示“在你绝对必须做之前不要做这项工作。”
延期表示“在调用者实际使用之前不要计算结果。”
实际上,当调用者决定使用评估结果(即开始迭代IEnumerable<T>
)时,这正是需要完成“工作”的时间点(例如发布查询数据库)。
术语延迟对于实际发生的事情更具体/更具描述性。当我说我
在讨论与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()可以立即触发并执行查询。