PropertIEs
在C#中為類預定義屬性是件再簡單不過的事,見程序1。
程序1
using System;
namespace PropertIEsDemo
{
public class MyData
{
...............
}
public class Class1
{
private MyData _data;
public MyData Data
{
get { return _data; }
}
public Class1()
{
_data = new MyData();
}
}
}
這是相當常見的屬性預定義方式,同時也是個可正常運行的程序,不過其中隱含著一個設計上的問題,那就是創建MyData對象的時機。按照程序2-1的手法,當Class1對象被創建之初,其內的_data對象也隨著被創建起來,這造成了Class1對象於創建初期就付出了一個MyData對象的內存成本,這對簡單的類來說或如牛毛,但倘若Class1對象中擁有一群這類屬性呢?為了解決這類問題,.Net Framework中大量使用Lazy-Allocate(緩分配)技術,見程序2。
程序2 Lazy-Allocate范例
public class Class1
{
private MyData _data;
public MyData Data
{
get
{
if(_data == null)
data = new MyData();
return _data;
}
}
public Class1() { }
}
Lazy-Allocate的設計概念很簡單,就是未使用前不預付成本。相對於程序2-1所使用的Pre-Allocate(預分配)概念,程序2-2采取以時間換取空間的策略,付出存取判斷式的代價來減輕空間浪費的情況。當然,Pre-Allocate也不是一無是處,不須預判斷的快速存取特色適用於用戶必然會存取的屬性,但在一些特定的屬性上,例如ASP.Net中常見的Style屬性就不適合使用Pre-Allocate技巧,因為用戶不一定會使用該屬性,於此情況下,Lazy-Allocate模式說可以讓對象省下一些內存成本。