2014-02-13 103 views
0

如何設置靜態類的私有靜態只讀數據成員?如何設置靜態類的私有靜態只讀數據成員?

public static class SessionInformation 
{ 
    private static readonly string UserName; 
    private static readonly string PluginID; 
    private static readonly string SessionID; 
} 

我有一些動態信息將被存儲在這個靜態類,但我希望這些信息不被編輯。

回答

5

只能設置那些在靜態構造函數,所以無論是:

public static class SessionInformation 
{ 
    private static readonly string UserName = "something"; 
    private static readonly string PluginID = "something else"; 
    private static readonly string SessionID = "some session"; 
} 

public static class SessionInformation 
{ 
    static SessionInformation() 
    { 
    UserName = "something"; 
    PluginID = "something else"; 
    SessionID = "some session"; 
    } 
} 

不,這不是存儲會話信息像這樣的:)這個問題是個好主意是,你幾乎不能控制這些值是什麼時候分配的,因爲靜態成員實際上相當複雜。更重要的是,你幾乎無法改變它們。因此,像HttpContext這樣的類不使用靜態字段,而是通過靜態屬性(如HttpContext.Current)訪問的正常實例。

更實際的方法是使用某種單例模式,讓您更好地控制賦值的時間,並允許您將它們作爲參數傳遞。然後,您將只讀域,但從外部分配(一次)。

而且,有可能是一個更好的解決方案,如果您不是專注於完成只讀的,例如:

public static class SessionInformation 
{ 
    private static bool hasBeenSet = false; 

    public static string UserName { get; private set; } 

    public static void SetValues(string userName) 
    { 
    if (hasBeenSet) return; 

    UserName = userName; 
    hasBeenSet = true; 
    } 
} 

這確實幾乎你想要什麼,而不readonly領域 - 他們是有效只讀從外面,但是。

(注意,這是一個簡單的舉例說明的樣品,它應該是更穩健,特別是在多線程環境)

+2

沒有。我認爲OP會尋求爲類 –

+1

提供這些值。信息是動態的。 – Ahsan

+1

@operation這意味着你不能使用靜態只讀,簡單明瞭。 – Luaan

2

在對方的回答中提到的Singleton模式是什麼,我相信你正在尋找。

public class Session 
{ 
    public string UserName { get; private set; } 
    public string PluginId { get; private set; } 
    public string SessionId { get; private set; } 

    public static Session Current { get; private set; } 

    public void NewSession(string userName, string pluginId, string sessionId) 
    { 
     Current = new Session 
     { 
      UserName = userName, 
      PluginId = pluginId, 
      SessionId = sessionId 
     }; 
    } 

    private Session() 
    { 

    } 
} 

在這裏,你可以創建一個新Session,你可以訪問所有你的申請靜態地Session.Current獲得只讀訪問權限的性質。更改任何值的唯一方法是在Session類中,或者如果使用NewSession-方法替換當前會話。