运行下图中 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 则不然。第二个实现在空间效率上更好。