Singleton实现比较

运行下图中 C# 代码,输出的结果是什么?并请比较这两个类型各有什么特点,有哪些区别

namespace Singleton

{

    public sealed class Singleton1

    {

        private Singleton1()

        {

            Console .WriteLine("Singleton1 constructed" );

        }

        public static void Print()

        {

            Console .WriteLine("Singleton1 Print" );

        }

        private static Singleton1 instance = new Singleton1 ();

        public static Singleton1 Instance

        {

            get

            {

                return instance;

            }

        }

    }

 

    public sealed class Singleton2

    {

        Singleton2()

        {

            Console .WriteLine("Singleton2 constructed" );

        }

        public static void Print()

        {

            Console .WriteLine("Singleton2 Print" );

        }

        public static Singleton2 Instance

        {

            get

            {

                return Nested .instance;

            }

        }

        class Nested

        {

            static Nested() { }

 

            internal static readonly Singleton2 instance = new Singleton2 ();

        }

    }

 

    class Program

    {

        static void Main(string [] args)

        {

            Singleton1 .Print();

            Singleton2 .Print();

        }

    }

}

答案 : 输出三行:第一行 “Singleton1 constructed” ,第二行 “Singleton1 Print” ,第三行 “Singleton2 Print”

当我们调用 Singleton1.Print 时, .NET 运行时会自动调用 Singleton1 的静态构造函数,并初始化它的静态变量。此时会创建一个 Singleton1 的实例,因此会调用它的构造函数 Singleton2 的实例是在 Nested 的静态构造函数里初始化的。只有当类型 Nested 被使用时,才回触发 .NET 运行时调用它的静态构造函数。我们注意到我们只在 Sington2.Instance 里面用到了 Nested 。而在我们的代码中,只调用了 Singleton2.Print 。因此不会创建 Singleton2 的实例,也不会调用它的构造函数

这两个类型其实都是单例模式( Singleton )的实现。第二个实现 Singleton2 只在真的需要时,才会创建实例,而第一个实现 Singleton1 则不然。第二个实现在空间效率上更好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值