我被要求在今天的采访中写辛格尔顿。我写了下面,请注意,我使用"属性集"方法进行设置,然后我使用"get"方法返回实例。但是我在互联网上看到他们使用的大多数地方都只得到,意思是,我在下面做的事情是错的?抱歉,我现在没有VS ide来验证它,所以在这里发布它。
此外,有些使用密封类,包括私有构造函数。为什么要用私人缺点密封?
public class Singleton
{
private static readonly Singleton instance;
private Singleton() {}
public static Singleton Instance
{
set
{
if(instance == null){
instance = new Singleton();
}
}
get
{
return instance;
}
}
}
我的建议是尝试自己编译和运行代码。这是迄今为止了解其工作原理的最简单方法。
如果您尝试构建代码,则会收到以下错误:
Error CS0198 A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)
换句话说,您应该在构造函数中实例化您的实例。
关于您的问题,需要一个私有构造函数来防止来自类外部的访问,并且足以确保其他类无法从您的类继承。你真的不需要密封。
您可以找到有关单例模式@https://csharpindepth.com/articles/singleton 的非常好的摘要
> @Learner 由于这是一个面试问题,而且主要是在印度,他们要求编写 Psuedo 代码来评估候选人的编码技能,因此我尝试让自己穿上候选人的鞋子来给出答案。
随着编程语言的进步,设计模式已经发展了一段时间,Singleton也不例外。有很多方法可以使用 C# 创建单例类。我想展示一些我能回忆起的味道
1. 没有线程安全的普通香草单例
public sealed class Singleton
{
private Singleton()
{
}
private static Singleton instance = null;
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
2. 单例与线程安全
public sealed class Singleton_ThreadLock
{
Singleton_ThreadLock()
{
}
private static readonly object padlock = new object();
private static Singleton_ThreadLock instance = null;
public static Singleton_ThreadLock Instance
{
get
{
// Uses the lock to avoid another resource to create the instance in parallel
lock (padlock)
{
if (instance == null)
{
instance = new Singleton_ThreadLock();
}
return instance;
}
}
}
}
3. 单例 - 双线程安全
public sealed class Singleton_DoubleThreadSafe
{
Singleton_DoubleThreadSafe()
{
}
private static readonly object padlock = new object();
private static Singleton_DoubleThreadSafe instance = null;
public static Singleton_DoubleThreadSafe Instance
{
get
{
if (instance == null)
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton_DoubleThreadSafe();
}
}
}
return instance;
}
}
}
4. 单例 - 早期初始化
public sealed class Singleton_EarlyInitialization
{
private static readonly Singleton_EarlyInitialization instance = new Singleton_EarlyInitialization();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton_EarlyInitialization()
{
}
private Singleton_EarlyInitialization()
{
}
public static Singleton_EarlyInitialization Instance
{
get
{
return instance;
}
}
}
5. 单例 - 使用 .Net 4.0+ 框架的延迟初始化
public sealed class Singleton
{
private Singleton()
{
}
private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance
{
get
{
return lazy.Value;
}
}
}
警告:
- 嗯,很少有人使用反射创建类的实例(我在我的一个框架中这样做了),但他也可以避免。网络中很少有样本可以显示如何避免它
- 始终是使 Singleton 类尽可能密封,因为它将限制开发人员继承该类。
- 市场上有很多 IOC 可以创建普通类的单例实例,而无需遵循上述单例实现。