System.Lazy 简介 - Dotnet 4.0






1.40/5 (6投票s)
本文介绍 System.Lazy 及其用途
引言
对象创建总是需要消耗资源的。最好在实际需要时才创建对象。否则,不必要的堆内存分配会导致内存负载。Lazy<T>
定义在 mscorlib 程序集中,属于 System 命名空间,确保对象仅在需要时才被创建。
使用代码
考虑以下程序
static void Main(string[] args)
{
var lazyObject = new Lazy<list<expandoobject>>
(
() =>
{
List<expandoobject> expandoList = new List<expandoobject>();
//Writing to Expando Collection
for (int i = 3; i-- > 1; )
{
dynamic dynObject = new ExpandoObject();
dynObject.Prop1 = GetValue(i);
expandoList.Add(dynObject);
}
return expandoList;
}
);
Console.WriteLine("Enter a value. 1 to proceed");
var read = Console.ReadLine();
List<expandoobject> expandoObj = null;
if (read == "1")
{
//If the value is not created
if (!lazyObject.IsValueCreated)
//Gets the lazily initialized value of the current Lazy<list<expandoobject>>
//instance.
expandoObj = lazyObject.Value;
//Read the values once the object is initialize
if (expandoObj != null)
{
Console.WriteLine(Environment.NewLine);
Console.WriteLine("The values are:");
foreach (dynamic d in expandoObj)
Console.WriteLine(d.Prop1);
}
}
}
GetValue
方法如下
private static string GetValue(int i)
{
Dictionary<int,> dict = new Dictionary<int,>();
dict.Add(1, "Niladri");
dict.Add(2, "Arina");
return dict[i];
}
让我们逐步了解我们正在做什么
Console.WriteLine("Enter a value. 1 to proceed");
var read = Console.ReadLine();
if (read == "1")
{
// do something
}
这段代码很容易理解。我们正在检查用户是否输入了 1 以继续。
List<expandoobject> expandoObj = null;
//If the value is not created
if (!lazyObject.IsValueCreated)
//Gets the lazily initialized value of the current Lazy<list<expandoobject>>
//instance.
expandoObj = lazyObject.Value;
IsValueCreated
的方法签名是
public bool IsValueCreated { get; }
这是一个只读属性,指示此 System.Lazy<t>
(在本例中为 Lazy<list<expandoobject>>
)实例是否已创建值。
如果此时尚未创建值,则通过使用 Lazy<t>
的 "Value" 属性,我们可以延迟初始化 Lazy<list<expandoobject>>
实例的值。换句话说,我们调用 ExpandoObject
类的构造函数。
var lazyObject = new Lazy<list<expandoobject>>
(
() =>
{
List<expandoobject> expandoList = new List<expandoobject>();
//Writing to Expando Collection
for (int i = 3; i-- > 1; )
{
dynamic dynObject = new ExpandoObject();
dynObject.Prop1 = GetValue(i);
expandoList.Add(dynObject);
}
return expandoList;
});
这段代码很简单,我们已经在 ExpandoObject
中创建了一个名为 "Prop1
" 的属性,并添加了一些值。
接下来,一旦对象被初始化,我们应该读取该值
if (expandoObj != null) { Console.WriteLine(Environment.NewLine); Console.WriteLine("The values are:"); foreach (dynamic d in expandoObj) Console.WriteLine(d.Prop1); }
程序输出是:
也可以使用以下方式读取值
if (lazyObject.IsValueCreated)
{
Console.WriteLine("The values are:");
lazyObject.Value.ForEach(i => Console.WriteLine((i as dynamic).Prop1));
}
结论
在这里,我们看到了 LazyLazy<t>
的概念。
非常感谢您对该主题的评论,以便改进该主题。
感谢阅读本文。