2017-07-02 128 views
0

我創建了名稱爲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; 
} 

而且,創建其他類獲得實例:

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

我的問題是爲什麼靜態方法在單例實例中不可用?

而我的代碼是正確的?

+0

好......這些都是'static'不'instance'成員,讓你從類型訪問它們不是實例:'AppDbContext.ConnectionString' –

+3

你能不能讀編譯錯誤? –

回答

1

靜態成員無法通過一個實例來引用。而是通過類型名稱引用它 。

來自docs

問題無關的事實你的實例是一個單獨的,引用靜態成員使用的類型名稱:

AppDbContext.Send(); 
1

對於初學者ConnectionStringprivate。您無法從其他課程訪問它。您也不能從實例訪問static方法。你需要使用類

AppDbContext.ConnectionString; 

AppDbContext.Send(); 
1

很好,因爲它們是靜態的,屬於類型(在你的情況AppDbContext )而不是對象實例,儘管用於訪問它的屬性是靜態的,但仍然創建一個實例的單例模式。所以,你可以給他們打電話與類型名稱

var connection = AppDbContext.ConnectionString; 
AppDbContext.Send(); 
相關問題