有没有比静态实例属性更好的方法?

时间:2012-10-15 13:25:23

标签: c# static singleton instance

我是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;
        }
    }
}

你知道一种更好的方法,因为它看起来并不像我这样的对象......

5 个答案:

答案 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,然后您可以将其配置为将您的类视为单身。