【问题标题】:Why are static methods not available in Singleton Instance?为什么单例实例中没有静态方法?
【发布时间】:2017-07-02 08:00:28
【问题描述】:

我创建了名称为SingletonGenerator<> 的泛型类型类。用于实现单格顿设计模式。所以,下面的代码就是类:

SingletonGenerator.cs

public class SingletonGenerator<T> where T : class, new()
{
    private static readonly Lazy<T> _instance =
      new Lazy<T>(() => new T(), LazyThreadSafetyMode.ExecutionAndPublication);

    private SingletonGenerator()
    {
    }

    public static T Instance => _instance.Value;
}

并且,为获取实例创建其他类:

AppDb.cs

public class AppDbContext
{
    public string Database { get; set; }
    private static string ConnectionString { get; set; }

    public static void Send()
    {
    }

    public void Go()
    {
    }
}

Program.cs

class Program
{
    static void Main(string[] args)
    {
        var context = SingletonGenerator<AppDbContext>.Instance;

        var database = context.Database; // is available 
        var connection = context.ConnectionString; //is not available

        context.Go(); // is available 
        context.Send(); // is not available
    }
}

我的问题是为什么单例实例中没有静态方法?

我的代码是否正确?

【问题讨论】:

  • 嗯...这些是static 而不是instance 成员,因此您可以从类型而不是实例访问它们:AppDbContext.ConnectionString
  • 你看不到编译错误吗?

标签: c# .net design-patterns singleton


【解决方案1】:

不能通过实例引用静态成员。相反,它 通过类型名称引用。

来自docs

问题与您的实例是单例无关,要引用静态成员,请使用类型名称:

AppDbContext.Send();

【讨论】:

    【解决方案2】:

    对于初学者来说,ConnectionStringprivate。您无法从其他班级访问它。

    您也不能从实例访问static 方法。你需要使用类

    AppDbContext.ConnectionString;
    
    AppDbContext.Send();
    

    【讨论】:

      【解决方案3】:

      好吧,因为它们是静态的并且属于类型(在您的情况下为 AppDbContext)而不是对象实例,使用单例模式您仍然可以创建一个实例,即使用于访问它的属性是静态的。所以你可以用类型名称来调用它们

      var connection = AppDbContext.ConnectionString;
      AppDbContext.Send();
      

      【讨论】:

        猜你喜欢
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 2012-11-12
        • 2017-10-06
        相关资源
        最近更新 更多