如何创建一个只能在C#中拥有单个实例的类

时间:2011-06-12 05:44:23

标签: c# .net singleton design-patterns

我想知道是否有一种机制或模式只允许C#中的一个类实例。我听说过Singleton课程,但我不知道如何使用它。

6 个答案:

答案 0 :(得分:9)

使用singleton,这是一个只允许创建自己的单个实例的类。

public sealed class Singleton
{
     public static readonly Singleton instance = new Singleton();
     private Singleton() {}
}

此模式的操作很简单,可以简化为以下内容:

隐藏Singleton类的构造函数,以便不会实例化客户端。             声明Singleton类私有成员变量,该变量包含对我们处理的唯一实例的引用。             在类Singleton中提供一个函数或属性,提供对Singleton实例维护的函数或属性的访问。

答案 1 :(得分:7)

你需要阅读我们自己的Jon Skeet blog (Implementing the Singleton Pattern in C#)

Singletom模式的意图是“确保一个类只有一个实例,并提供一个全局访问点”。

这是你如何做到的。

public sealed class Singleton {

    private static readonly Singleton instance = new Singleton();

    private Singleton() {       
    }

    public static Singleton Instance
    {
        get 
        {
            return instance;
        }
    }    
}

答案 2 :(得分:6)

这可以是Singletone实现的示例

public sealed class CSingleTone
{
    private static CSingleTone instance;
    public int SomeValue{ get; set; }
    public static CSingleTone Instance
    {
        get
        {
            if (instance == null)
                instance = new CSingleTone();
            return instance;
        }
    }
    private CSingleTone()
    {
    }
}

可以这种方式使用

int r = CSingleTone.Instance.SomeValue;

答案 3 :(得分:3)

Singleton不是一个类,而是一个模式。 这是一个例子:

class Singleton {
    private Singleton() {}

    static private Singleton GetIt() {
        return theOne;
    }

    static private Singleton theOne = new Singleton();
}

答案 4 :(得分:2)

一种选择是仅声明仅static成员的static课程。或者,您可以通过为类提供private构造函数来实现Singleton模式:

public class MySingleton
{
    public static readonly MySingleton Instance = new MySingleton();

    private MySingleton() { }

    // Members ...
}

答案 5 :(得分:2)

这是一个单例类

的简单示例
class Program
{
    static void Main()
    {
    SiteStructure s = SiteStructure.Instance;
    }
}

public sealed class SiteStructure
{
    static readonly SiteStructure _instance = new SiteStructure();
    public static SiteStructure Instance
    {
    get
    {
        return _instance;
    }
    }
    SiteStructure()
    {
    // Initialize.
    }
}

此处,Readonly允许thread-safety,这意味着它只能是allocated once。它有一个public static getter。调用者使用Instance property来获取 singleton 实例。 已知Sealed允许编译器在JIT compilation期间执行特殊优化。上面的最终方法是私有实例构造函数和Initialize方法。 Private constructors表示班级可以only allocate itself