65.9K
CodeProject 正在变化。 阅读更多。
Home

System.Lazy 简介 - Dotnet 4.0

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.40/5 (6投票s)

2010年10月25日

CPOL

1分钟阅读

viewsIcon

30518

downloadIcon

112

本文介绍 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);
}

程序输出是:

LazyInitializers/1.jpg

也可以使用以下方式读取值

if (lazyObject.IsValueCreated)
{
  Console.WriteLine("The values are:");
  lazyObject.Value.ForEach(i => Console.WriteLine((i as dynamic).Prop1));
}

结论

在这里,我们看到了 Lazy如何以临时方式帮助我们创建对象。希望这有助于理解 Lazy<t> 的概念。

非常感谢您对该主题的评论,以便改进该主题。

感谢阅读本文。

© . All rights reserved.