如何设置静态类的私有静态只读数据库?

时间:2014-02-13 10:25:16

标签: c#

如何设置静态类的私有静态只读数据库?

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

我有一些动态信息会存储在这个静态类中,但我希望以后不再编辑这些信息。

2 个答案:

答案 0 :(得分:6)

您只能在静态构造函数中设置它们,因此:

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字段之外,这几乎可以满足您的需求 - 但它们实际上是从外部读取的。

(请注意,这是一个简单的说明性示例,它应该更强大,尤其是在多线程环境中)

答案 1 :(得分: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方法替换当前会话。