如何访问Singleton类的静态方法?

时间:2010-11-17 16:16:37

标签: c# asp.net oop

我对单身人士课有些困惑,下面是我的一些观点:

  1. 单例类可以有静态方法吗?如果是,那么我们如何调用这些方法?
  2. Static class和Singleton Class之间的主要区别是什么?
  3. 我创建了我的单例类,如下所示:

     public class Singleton
        {
            private static  Singleton _instance = null;
            private static object chekLock = new object();
            private Singleton()
            {}
    
            public static Singleton Instance
            {
                get
                {
                    lock (chekLock)
                    {
                        if (_instance == null)
                            _instance = new Singleton();
                        return _instance;
                    }
                }
            }
    
            public static void StaticAddMethod()
            {
                Console.WriteLine("Add Method");
            }
    
            public void AddMethod()
            {
                Console.WriteLine("Add Method");
            }
        }
    

    在上面的类结构中,我创建了两个方法,一个是静态,第二个是非静态的,当我尝试访问静态方法时,它给出了编译时错误。

    如何使用单例类的静态方法?

7 个答案:

答案 0 :(得分:6)

您是如何尝试访问它的?要访问静态方法,请使用类型名称:

Singleton.StaticAddMethod();

VS

Singleton.Instance.AddMethod();

另请注意,有更简单的实现单例的方法,可以减少锁定等同样的效果。

重新判断单身和静止之间的区别;单例可以实现一个接口,允许您将其传递给现有代码。您也可以(正如您所做的那样)推迟构造单例(但仍然允许访问不涉及单例实例的静态方法)。但是是的:静态和单身之间存在很多交叉。

答案 1 :(得分:2)

您应该通过以下方式访问静态方法:

Singleton.StaticAddMethod()

或者,如果您已经 Singleton内,那么只需:

StaticAddMethod()

不同之处在于可以从任何地方访问静态方法。实例方法要求您在创建的类实例上调用该方法。对于Singleton,这意味着该类具有实例字段/方法,但您可以通过静态Instance属性访问该唯一实例。

答案 2 :(得分:2)

静态方法属于类型本身,而不属于类型的实例。所以你可以像这样调用静态方法:

Singleton.StaticAddMethod()

答案 3 :(得分:2)

可以直接从Type调用静态方法。您无需创建实例即可。

所以

Singleton.StaticAddMethod();

会工作

同时更改您的声明

private static  Singleton _instance = null;

private static READONLY  Singleton _instance = new Singelton();

这将允许您摆脱所做的所有锁定,因为readonly只能在创建时分配,保护您免受任何可能遇到的锁定;)

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

答案 4 :(得分:1)

像这样:

Singleton.StaticAddMethod();

Singleton.Instance.AddMethod();

答案 5 :(得分:0)

对于你的第二个问题,两者之间的一个区别是单例类可以被子类化并以静态类不能的方式参与多态行为。

答案 6 :(得分:0)

以下是如何访问线程安全的Singleton类成员以及如何编写该类的示例。

http://www.helplessautomation.com/2011/01/creating-a-singleton-in-c-instance-class/

El Matador