如何设置静态类的私有静态只读数据库?
public static class SessionInformation
{
private static readonly string UserName;
private static readonly string PluginID;
private static readonly string SessionID;
}
我有一些动态信息会存储在这个静态类中,但我希望以后不再编辑这些信息。
答案 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模式是我相信你正在寻找的。 p>
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
方法替换当前会话。