【问题标题】:How to access Singleton class's static method?如何访问 Singleton 类的静态方法?
【发布时间】:2011-05-11 12:40:45
【问题描述】:

我对单例类有些困惑,以下是我的一些观点:

  1. 单例类可以有静态方法吗?如果可以,我们如何调用这些方法?
  2. 静态类和单例类的主要区别是什么?

我已经按如下方式创建了我的单例类:

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

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

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

【问题讨论】:

  • 列出您尝试通过使用单例实现的目标可能会有所帮助,因为该类不是单例,它只是一个包含静态方法的类。
  • 您如何尝试访问静态方法?你应该使用 Singleton.StaticAddMethod() 你得到什么编译错误?
  • 如果您正在运行 .NET 4,我会考虑将 Lazy<T> 对象与您的 Singleton 一起使用。真的很好很干净:geekswithblogs.net/BlackRabbitCoder/archive/2010/05/19/…

标签: c# asp.net oop


【解决方案1】:

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

所以

Singleton.StaticAddMethod();

会工作

同时更改您的声明

private static  Singleton _instance = null;

private static READONLY  Singleton _instance = new Singelton();

这将使您摆脱正在执行的所有锁定,因为只读只能在创建时分配,从而保护您免受可能遇到的任何锁定;)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你能给我任何子类和多态行为的例子吗
    • 对于静态类,你可以像 MyStaticClass.DoSomething();使用单例,您可以对其进行子类化并像这样使用它:MyClass.Instance.DoSomething();
    【解决方案3】:

    像这样:

    Singleton.StaticAddMethod();
    
    Singleton.Instance.AddMethod();
    

    【讨论】:

      【解决方案4】:

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

      Singleton.StaticAddMethod();
      

      Singleton.Instance.AddMethod();
      

      还要注意,有一些更简单的方法可以实现相同的效果,但锁定更少等。

      重新区分单例和静态;单例可能会实现一个接口,允许您将其传递到现有代码中。您还可以(就像您正在做的那样)推迟单例的构造(但仍然允许访问不涉及单例实例的静态方法)。但是是的:静态和单例之间有很多交叉。

      【讨论】:

      • 只是对“实现单例的更简单方法,以更少的锁定实现相同效果”部分的评论 - here's 一个很好的资源,其中包括关于如何使其线程安全的简短说明“同步”关键字。
      • @chrisf c# lock (根据问题)的含义几乎相同。您可以使用 JIT 解释为同步的属性,但很少看到它在使用中。
      • 啊。我忽略了它是 C# 的那部分。道歉。
      【解决方案5】:

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

      Singleton.StaticAddMethod()
      

      【讨论】:

        【解决方案6】:

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

        Singleton.StaticAddMethod()
        

        或者,如果你已经在里面 Singleton,那么只需:

        StaticAddMethod()
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-07
          • 2012-02-27
          • 1970-01-01
          • 2015-03-31
          • 2011-08-19
          相关资源
          最近更新 更多