zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    python 获取当前路径
    python 执行结果输出为txt
    python def 定义函数
    python:浅析python 中__name__ = ‘__main__’ 的作用
    python 数组新增或删除元素
    python在Windows安装PIL的方法
    静态路由学习总结
    zookeeper客户端命令行操作
    kudu安装过程中可能出现的问题
    sudo: /etc/sudoers is world writable|给用户添加权限报错
  • 原文地址:https://www.cnblogs.com/wintersun/p/2029281.html
Copyright © 2011-2022 走看看