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()
    {

    }   
}