2009年6月17日 星期三

[C#] Deferred Query Execution

什麼是 Deferred Query(延遲查詢) Execution 呢?

這是在看 LINQ In Action 的時候發現的,查詢了一下,原來這是 C# 2.0 就已經提供的功能.....

用途在於可以用更少的資源(Resource)使用集合(collection)物件!

為何這麼說呢? 以下用一段程式碼來說明:


using System;
using System.Linq;

namespace DeferredQueryExecution
{
class Program
{
static double Square(double n)
{
//每呼叫 Square 就會印出下列訊息
Console.WriteLine("Computing Square(" + n + ")....");
return Math.Pow(n, 2);
}

static void Main(string[] args)
{
int[] numbers = { 1, 2, 3 };

//取得 numbers 陣列中所有元素的平方值並存入 query 集合物件中
var query =
from n in numbers
select Square(n);

//印出 query 集合物件的內容
foreach (var n in query)
Console.WriteLine(n);

Console.ReadLine();
}
}
}



這一段程式碼執行完的結果會是如何呢? 一般來說,應該是以下這樣....
Computing Square(1)....
Computing Square(2)....
Computing Square(3)....
1
4
9

但實際跑出來的結果並非這樣,而是:
Computing Square(1)....
1
Computing Square(2)....
4
Computing Square(3)....
9

結果令人出乎意料吧!

從結果可以看出,.NET compile 在處理集合物件時,並非一次給定完整結果,而是「真的有需要才一個一個慢慢給出」,因此當集合物件的數量龐大時,可以有效降低系統資源的浪費,提升在操作集合物件時的效能。

當然,這跟 LINQ 好像沒啥關係......因此只要了解一下 .NET 有這種機制存在即可囉!

沒有留言:

張貼留言