• .net4.0下的Lazy<T>类型简单应用


          .net framework为我们提供了一个Lazy<T> 类型,给我们开发带来很多便利,看如下的代码,有这样一个Class做示例:

       1:      public class Person
       2:      {
       3:          public int Age { get; set; }
       4:   
       5:          public Person()
       6:          {
       7:              Age = 1;
       8:              Console.WriteLine("Created");
       9:          }
      10:   
      11:          public void Action()
      12:          {
      13:              Console.WriteLine("Run");
      14:          }
      15:      }

        接着我们看如何延迟加载加载它:

       1:          [Test]
       2:          public void TestLazyObject()
       3:          {
       4:              Lazy<Person> person = new Lazy<Person>(() => new Person() { Age=28 });
       5:              var p = person.Value;
       6:   
       7:              if (person.IsValueCreated) 
       8:                  Console.WriteLine("Person is initialized now..");
       9:   
      10:              Assert.AreEqual(28, p.Age);
      11:          }

        注意上面的代码只有第5行被执行后,Person这个对象才被创建,输出:

    Created
    Person is initialized now..
       利用这个特性,我们可以实现Singleton模式,我们先定义这样的一个类型:
       1:      /// <summary>
       2:      /// Singleton under .net framework 4.0
       3:      /// </summary>
       4:      /// <typeparam name="T">specific class</typeparam>
       5:      /// <seealso cref="http://msdn.microsoft.com/en-us/library/dd642331.aspx"/>
       6:      /// <remarks>author Petter Liu http://wintersun.cnblogs.com </remarks>
       7:      public static class Singleton<T> where T:class
       8:      {
       9:          // Initializes a new instance of the Lazy<T> class. When lazy initialization occurs, the specified
      10:          //     initialization function and initialization mode are used.
      11:          private static readonly Lazy<T> current = new Lazy<T>(
      12:              () => 
      13:                  Activator.CreateInstance<T>(),    // factory method
      14:                  true);                                       // double locks
      15:   
      16:          public static object Current
      17:          {
      18:              get { return current.Value; }
      19:          }
      20:      }

    注意上面的代码第14行,指定线程安全,这就等于是double check, 我们还可以看下这个构造函数的定义:

    public Lazy(Func<T> valueFactory, bool isThreadSafe) : this(valueFactory, isThreadSafe ? LazyThreadSafetyMode.ExecutionAndPublication : LazyThreadSafetyMode.None)
    {
    }

    当第二个参数为true时选择是LazyThreadSafetyMode.ExecutionAndPublication。最后是UnitTest:

       1:          [Test]
       2:          public void TestUsingLayzImplementSingleton()
       3:          {
       4:             var person1 = Singleton<Person>.Current;
       5:             var person2 = Singleton<Person>.Current;
       6:   
       7:             Assert.AreEqual(person1, person2);
       8:          }

    您可能这篇文章也感兴趣:dotnet3.5下Singleton辅助类实现

    希望对您开发有帮助。


    作者:Petter Liu
    出处:http://www.cnblogs.com/wintersun/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    该文章也同时发布在我的独立博客中-Petter Liu Blog

  • 相关阅读:
    Java ES api 查询例子
    leveldb学习
    Viewstamp Replication协议
    PacificA协议
    vhost架构
    数据分片方法
    常见分布式存储系统架构分析
    数据存储(B+树 vs LSM树)
    paxos算法理解
    Raft协议理解
  • 原文地址:https://www.cnblogs.com/wintersun/p/2029281.html
Copyright © 2020-2023  润新知