我是C#的新手,目前我正在使用这种方式始终使用相同的实例:
public class Sample{
private Sample(){
//initialize sth.
}
private static Sample _instance;
public static Sample Instance{
get{
if(_instance == null)
_instance = new Sample();
return _instance;
}
}
}
你知道一种更好的方法,因为它看起来并不像我这样的对象......
答案 0 :(得分:2)
您的问题的答案取决于您打算如何使用该属性。通常在整个应用程序中具有单个静态属性被认为是错误的想法,因为在涉及多线程环境/单元测试等问题时会引起很多麻烦。但是,有一些情况它实际上是正确的方法,例如日志记录。
或者,您可以使用另一种方法将实例传递给任何需要它的人 - 通常称为Dependency Injection。
答案 1 :(得分:0)
如果你想要一个Singleton类,那没关系。这种模式只用于此类的一个实例。
答案 2 :(得分:0)
是的,这种方法完全有效。但是,要小心初始化getter
属性的Instance
中的单例实例 - 特别是如果创建所述对象需要很长时间。
答案 3 :(得分:0)
当然,使用Lazy<T>
并让框架处理避免实现产生的竞争条件。
private static Lazy<Sample> _instanceLazy = new Lazy<Sample>(() => new Sample());
public static Instance{get {return _instanceLazy.Value;} }
绝对值得记住singleton sucks。
答案 4 :(得分:0)
要创建单身人士,您可以使用多种方法。
如果你明确地写它,我找到的最好的实现方法(很好的线程安全)是:
public sealed class Singleton
{
Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
但另一种方法是使用Inversion of Control框架,例如Unity或Castle Windsor,然后您可以将其配置为将您的类视为单身。