C#C#基础知识回顾—你无亮堂之Lazy

   
对象的成立形式,始终表示了软件工业的生产力方向,代表了进取软件技术发展之势头,也表示了广程序开发者的国有智慧。以new的方创立,通过工厂方法,利用IoC容器,都为不同之道贯彻了有目共睹实例成员的创生。而本文所关切之Lazy<T>也是关乎就事情的。不过,简单说来,Lazy<T>要落实之虽然是依“需”创造,而休是限期创制。

咱俩往往时有暴发那样的景色,一个事关对象的开创需要相比生之出,为了制止在每便运行时创建这种武器,有雷同栽聪明的道称实现“懒对象”,或者延缓加载。.NET
4.0此前,实现懒对象的编制,需要开发者自己来贯彻和治本它的概念如下:

 

[Serializable]
public class Lazy<T>
{
    public Lazy();
    public Lazy(bool isThreadSafe);
    public Lazy(Func<T> valueFactory);
    public Lazy(Func<T> valueFactory, bool isThreadSafe);

    public bool IsValueCreated { get; }
    public T Value { get; }

    public override string ToString();
}

如果,我们发出一个胖子:

public class Big
{
    public int ID { get; set; }

    // Other resources
}

打Lazy<T>的定义可知,其Value属性就是大家包装在Lazy
Wrapper中的真实Big对象,那么当我们率先次走访lazyBig.Value时,就掉机关的创导Big实例。

static void Main(string[] args)
{
    Lazy<Big> lazyBig = new Lazy<Big>();

    Console.WriteLine(lazyBig.Value.ID);
}

当然,有这定义可知,Lazy远没有这样吝啬,它以还好啊咱提供以下的劳务:

  • 经过IsValueCreated,获取是否“已经”创制了实例对象。
  • 解决非默认构造函数问题。

显。大家的Big类并没提供带参数构造函数,那么如下的Big类:

public class Big
{
    public Big(int id)
    {
        this.ID = id;
    }

    public int ID { get; set; }

    // Other resources
}

上述创建情势以引发运行时生,提醒包装对象没管参的构造函数。那么,这种情状下之推加载,该怎么着对呢?其实Lazy<T>的协会中尚连:

public Lazy(Func<T> valueFactory);

她正是用来应针对如此的挑衅:

static void Main(string[] args)
{
    // Lazy<Big> lazyBig = new Lazy<Big>();
    Lazy<Big> lazyBig = new Lazy<Big>(() => new Big(100));

    Console.WriteLine(lazyBig.Value.ID);
}

实则,从public Lazy(Func<T>
valueFactory)的定义可知,valueFactory可以回去任意的T实例,那么任何复杂的构造函数,对象工厂要IoC容器格局都得于是以轻松的计万分,例如:

public class BigFactory
{
    public static Big Build()
    {
        return new Big(100);
    }
}

好应用Lazy<T>和BigFactory实现Big的延期加载:

static void Main(string[] args)
{
    Lazy<Big> lazyBig = new Lazy<Big>(() => BigFactory.Build());

    Console.WriteLine(lazyBig.Value.ID);
}
  • 供多线程环境协助。

除此以外的构造器:

public Lazy(bool isThreadSafe);
public Lazy(Func<T> valueFactory, bool isThreadSafe);

蒙,isThreadSafe则应用叫多线程环境下,假使isThreadSafe为false,那么延迟加载对象则等同潮只好创设于一个线程。

 

至于Lazy<T>的使,其实早就休是一个纯粹的言语问题,还涉及了针对性规划之考量,例如落实全部对象的推迟加载,或者实现延迟属性,考量线程安全等等。就不说叫太多。因为,.NET
4.0提供的关注度实在多,大家眼花缭乱了。

 郑重宣示本文非本创……

 

 

相关文章