1

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

你知道更好的方法吗,因为它对我来说似乎不太面向对象......

4

5 回答 5

2

您的问题的答案取决于您打算如何使用该物业。通常,在整个应用程序中使用单个静态属性被认为是一个主意,因为当涉及到多线程环境/单元测试等问题时,它可能会引起很多麻烦。但是,在某些情况下,它实际上是正确的方法,例如记录。

或者,您可以使用另一种方法,将实例传递给需要它的任何人——通常称为Dependency Injection

于 2012-10-15T13:30:36.903 回答
0

如果你想要一个 Singleton 类,没关系。这种模式用于只有一个此类的实例。

于 2012-10-15T13:28:20.087 回答
0

是的,这种方法是完全有效的。getter但是,在初始化属性中的单例实例时要小心Instance——尤其是在创建所述对象需要很长时间的情况下。

于 2012-10-15T13:29:47.467 回答
0

当然,使用Lazy<T>并让框架处理避免您的实现产生的竞争条件。

private static Lazy<Sample> _instanceLazy = new Lazy<Sample>(() => new Sample());
public static Instance{get {return _instanceLazy.Value;} }

绝对值得记住单例很糟糕

于 2012-10-15T13:30:25.250 回答
0

要创建 Singleton,您可以使用多种方法。

如果你明确地写它,我发现的最好的实现方法(很好的线程安全)是:

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();
    }
}

但另一种方法是使用控制反转框架,例如 Unity 或 Castle Windsor,然后您可以将其配置为将您的类视为单例。

于 2012-10-15T13:32:21.627 回答