关于C#Static Readonly成员

时间:2010-01-26 14:35:01

标签: c# static readonly

我有以下情况。我的应用程序中有一些非常常见的类,它包含一个名为“BinDirectory”的静态只读字段,它保存bin目录的路径。此类中的其他字段(也是静态只读)也使用此值作为其值的基础。在当前版本上,BinDirectory被初始化为保存代码运行的目录(即Assembly.GetExecutingAssembly()。CodeBase)。我想扩展此类以初始化BinDirectory,以便在从我的应用程序安装程序运行时从安装程序上下文中保存“TargetDir”。我可以将BinDirectory改为静态但我不想,因为它会让我对我的应用程序中常见的类进行大量更改。有人可以为这个问题提出一个优雅的解决方案吗?

3 个答案:

答案 0 :(得分:5)

将其设为仅具有“获取”访问权限的属性:

public static string BinDirectory
{
    get { return _initialisedBinDirectory; }
}

然后在静态构造函数代码中,根据需要初始化私有变量。

修改

延迟加载(根据评论):

public static string BinDirectory
{
    get
    {
        if (_initialisedBinDirectory == null)
            // load the variable when needed
        else
            return _initialisedBinDirectory;
    }
}

这样您只需在需要时加载变量,并且只要再次调用它就会重新使用它。希望你不要将null作为它的有效值。

答案 1 :(得分:3)

这就是AppConfigs的用途。在AppSettings部分,添加名为BinDirectory的新密钥。您可以将您的课程重写为:

public static string BinDirectory
{
    get
    {
        return ConfigurationManager.AppSettings["BinDirectory"];
    }
}

最后,作为安装过程的最后一步,您可以将BinDirectory更改为指向所需的任何目录。所以现在这个值完全由安装程序上下文决定。

答案 2 :(得分:0)

听起来你不愿意将静态只读字段更改为静态,因为它会强制您更改类中所有其他静态只读字段的初始化。

如果这是正确的,不幸的是,你可以做很多事情,但要花时间做出改变。通过允许在运行时设置BinDirectory字段,您将从根本上改变字段的初始化顺序。您的代码需要适应。

我认为最简单的方法是转换为使用静态只读属性,这些属性可以动态计算值。

例如:

public class Values { 
  public static string BinDir;
  public static string OtherDir { 
    get { return Path.Combine(BinDir,@"Some\Other\Path"); } 
  }
}