一个对象的延迟初始化意味着该对象的创建将会延迟至第一次使用该对象时。 (在本主题中,术语"延迟初始化"和"延迟实例化"是同义词。) 延迟初始化主要用于提高性能,避免浪费计算,并减少程序内存要求。 以下是最常见的方案:
- 有一个对象的创建开销很大,而程序可能不会使用它。 例如,假定您在内存中有一个 Customer 对象,该对象的 Orders 属性包含一个很大的 Order 对象数组,该数组需要数据库连接以进行初始化。 如果用户从未要求显示 Orders 或在计算中使用其数据,则没有理由使用系统内存或计算周期来创建它。 通过使用 Lazy<Orders> 将 Orders 对象声明为延迟初始化,可以避免在不使用该对象的情况下浪费系统资源。
- 有一个对象的创建开销很大,您想要将创建它的时间延迟到完成其他开销大的操作之后。 例如,假定您的程序在启动时加载若干个对象实例,但只有一些对象实例需要立即执行。 通过将不必要的对象的初始化延迟到已创建必要的对象之后,可以提高程序的启动性能。
public partial class MainWindow : Window
{
Lazy<Test> _t1;
Lazy<Test> _t2;
public MainWindow()
{
InitializeComponent();
// using empty constructor.
_t1 = new Lazy<Test>();
// using constructor with parameter.
_t2 = new Lazy<Test>(() => new Test("a string"));
}
}
class Test
{
public Test()
{
}
public Test(string str)
{
_str = str;
}
private string _str;
public string Str
{
get { return _str; }
set { _str = value; }
}
}