【IT168 技术】延迟加载,亦称延迟实例化,延迟初始化等,主要表达的思想是,把对象的创建将会延迟到使用时创建,而不是在对象实例化时创建对象,即用时才加载。这种方式有助于提高于应用程序的性能,避免浪费计算,节省内存的使用等。针对于这种做法,似乎称之为即用即创建更为合适些。
先来看一下在Framework4.0中如何实现延迟加载。
Framework4.0提供了一个包装类 Lazy
///这行代码表明:要创建一个延迟加载的字符串对象s
///原型为Lazy<T> 对象名=new Lazy<T>(Fun<T>)
///采用泛型委托进行构造,实例化此委托时要求必须是返回值T类型的方法
///如在本例中,T为string,则TestLazy.GetString方法的返回值必须也是string类型
Lazy<string> s = new Lazy<string>(TestLazy.GetString);
///原型为Lazy<T> 对象名=new Lazy<T>(Fun<T>)
///采用泛型委托进行构造,实例化此委托时要求必须是返回值T类型的方法
///如在本例中,T为string,则TestLazy.GetString方法的返回值必须也是string类型
Lazy<string> s = new Lazy<string>(TestLazy.GetString);
本例中TestLazy.GetString()方法如下示:
public class TestLazy
{
public static string GetString()
{
return DateTime.Now.ToLongTimeString();
}
}
{
public static string GetString()
{
return DateTime.Now.ToLongTimeString();
}
}
可以通过IsValueCreated属性来确定对象是否已创建,通过Value属性来获取当前对象的值。
Console.WriteLine(s.IsValueCreated);//返回False
Console.WriteLine(s.Value); //返回s的当前值
Console.WriteLine(s.IsValueCreated);//返回True
Console.WriteLine(s.Value); //返回s的当前值
Console.WriteLine(s.IsValueCreated);//返回True
下面经出完整代码,以供测试:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5
6 ///这行代码表明:要创建一个延迟加载的字符串对象s
7 ///原型为Lazy 对象名=new Lazy(Fun)
8 ///采用泛型委托进行构造,实例化此委托时要求必须是返回值T类型的方法
9 ///如在本例中,T为string,则TestLazy.GetString方法的返回值必须也是string类型
10 Lazy s = new Lazy(TestLazy.GetString);
11 Console.WriteLine(s.IsValueCreated);//返回False
12 Console.WriteLine(s.Value); //返回S的当前值
13 Console.WriteLine(s.IsValueCreated);//返回True
14 }
15
16 }
17 public class TestLazy
18 {
19 public static string GetString()
20 {
21 return DateTime.Now.ToLongTimeString();
22 }
23 }
2 {
3 static void Main(string[] args)
4 {
5
6 ///这行代码表明:要创建一个延迟加载的字符串对象s
7 ///原型为Lazy 对象名=new Lazy(Fun)
8 ///采用泛型委托进行构造,实例化此委托时要求必须是返回值T类型的方法
9 ///如在本例中,T为string,则TestLazy.GetString方法的返回值必须也是string类型
10 Lazy s = new Lazy(TestLazy.GetString);
11 Console.WriteLine(s.IsValueCreated);//返回False
12 Console.WriteLine(s.Value); //返回S的当前值
13 Console.WriteLine(s.IsValueCreated);//返回True
14 }
15
16 }
17 public class TestLazy
18 {
19 public static string GetString()
20 {
21 return DateTime.Now.ToLongTimeString();
22 }
23 }