C# 使用Lazy 懒加载

用Lazy对象能实现懒加载的效果,就是预先定制好对象,但是不去创建它,直到第一次使用的时候才会真正的创建,而且这个还是线程安全的,有了这个玩意,就不用自己去写类似的东西以及单例模式了

static void Start() {
            Lazy<AAA> aaa = new Lazy<AAA>();
            Console.WriteLine("AAA已经懒加载了,但是还没创建");
            aaa.Value.Do();
        }
        class AAA {
            public AAA() {
                Console.WriteLine("AAA创建");
            }
            public void Do() {
                Console.WriteLine("AAA Do");
            }
        }

 通过Lazy实现单例模式

internal class AAA {
        /// <summary>
        /// 通过懒加载实现单例模式,so easy!
        /// </summary>
        public static AAA Instance = new Lazy<AAA>(() => new AAA()).Value;
        /// <summary>
        /// 将无参构造函数设置成私有的
        /// </summary>
        private AAA() {
            Console.WriteLine("create AAA");
        }
        public void Test() {
            Console.WriteLine("test");
        }
        /// <summary>
        /// 貌似调用静态成员,Lazy就开始实际创建AAA对象了
        /// </summary>
        public static void TestAAA() {
            Console.WriteLine("testAAA");
        }
    }

  稍微改进一下就不会在调用其他成员的时候就触发的lazy了,否则懒加载就没意义了

internal class AAA {
        static readonly Lazy<AAA> instance = new Lazy<AAA>(() => new AAA("aaa"));
        /// <summary>
        /// 不能直接new Lazy<AAA>(() => new AAA("aaa")).Value,这样会立刻创建对象,懒加载就没有意义了
        /// </summary>
        public static AAA Instance { get { return instance.Value; } }
        static readonly Lazy<AAA> instance2 = new Lazy<AAA>(() => new AAA("bbb"));
        public static AAA Instance2 { get { return instance2.Value; } }
        /// <summary>
        /// 将无参构造函数设置成私有的
        /// </summary>
        private AAA(string id) {
            Console.WriteLine("create AAA:" + id);
        }
        public void Test() {
            Console.WriteLine("test");
        }
        /// <summary>
        /// 这次调用其他成员,就不会创建懒加载的对象了
        /// </summary>
        public static void TestAAA() {
            Console.WriteLine("testAAA");
        }
    }

 

posted @ 2021-09-08 18:51  WmW  阅读(1924)  评论(0编辑  收藏  举报