为什么单例实例中没有静态方法?

时间:2017-07-02 08:00:28

标签: c# .net design-patterns singleton

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

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

并为get实例创建其他类:

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
    }
}

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

我的代码是正确的吗?

3 个答案:

答案 0 :(得分:1)

对于初学者privatestatic。您无法从其他类访问它。

您也无法从实例访问AppDbContext.ConnectionString; AppDbContext.Send(); 方法。你需要使用类

ionViewDidLoad(){
    this.loadDashboardItems();
}

答案 1 :(得分:1)

  

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

来自docs

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

AppDbContext.Send();

答案 2 :(得分:1)

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

来调用它们
var connection = AppDbContext.ConnectionString;
AppDbContext.Send();