C# 如何设置静态类的私有静态只读数据成员?
如何设置静态类的私有静态只读数据成员C# 如何设置静态类的私有静态只读数据成员?,c#,C#,如何设置静态类的私有静态只读数据成员 public static class SessionInformation { private static readonly string UserName; private static readonly string PluginID; private static readonly string SessionID; } 我有一些动态信息将存储在此静态类中,但我希望以后不要编辑这些信息。您只能在静态构造函数中设置这些
public static class SessionInformation
{
private static readonly string UserName;
private static readonly string PluginID;
private static readonly string SessionID;
}
我有一些动态信息将存储在此静态类中,但我希望以后不要编辑这些信息。您只能在静态构造函数中设置这些信息,因此:
public static class SessionInformation
{
private static readonly string UserName = "something";
private static readonly string PluginID = "something else";
private static readonly string 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
字段的情况下,这几乎可以实现您想要的功能—不过,它们实际上是从外部只读的
(请注意,这是一个简单的示例,它应该更健壮,特别是在多线程环境中)另一个答案中提到的单例模式就是我相信您正在寻找的
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.Current
静态访问整个应用程序,以获得对属性的读取访问权。更改任何值的唯一方法是在会话
类中,或者使用新闻会话
-方法替换当前会话。否。我认为OP希望为客户提供这些价值class@operation这意味着您不能简单地使用静态只读。@operation“dynamic”是一个时髦词。您希望能够更改值,但不更改值?
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()
{
}
}