【问题标题】:Regarding C# Static Readonly members关于 C# 静态只读成员
【发布时间】:2010-01-26 14:35:00
【问题描述】:

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

【问题讨论】:

    标签: c# static readonly


    【解决方案1】:

    仅使用“get”访问器将其设为属性:

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

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

    编辑

    延迟加载(根据评论):

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

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

    【讨论】:

    • 这不起作用,因为静态构造函数将在有人第一次使用我的类时运行,这可能发生在我调用 BinDirectory 属性之前。
    • 我想到了一个代码生成解决方案或者另一种优雅的方式。
    • 我不明白您对这种方法的问题的评论。
    • 第一次使用您的类时会运行静态构造函数。这意味着当您编写 Class.BinDirectory 时,静态构造函数首先运行,然后运行属性。上面的代码假设 _initialisedBinDirectory 在调用静态构造函数之前被初始化,这实际上是不可行的。
    • 你不能写 Class.BinDirectory 因为它是只读的(没有设置)。上面的代码假设你在静态构造函数中初始化了 _initializedBinDirectory。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我想你错过了一些括号 ()get
    • 但是我可以在运行时更改 AppSetting 吗?如果是,那么这就是我的解决方案。
    • 最佳答案在这里,是的,您可以在运行时更改应用设置。
    • 谢谢朱丽叶这是我的解决方案
    • 有些人可能会建议使用支持字段,但看起来 ConfigurationManager 只读取一次并将其 NameValueCollection 保存在静态属性中。
    【解决方案3】:

    听起来您不愿意将静态只读字段更改为简单的静态字段,因为这会迫使您更改类中所有其他静态只读字段的初始化。

    如果这是正确的,那么很遗憾,您无能为力,只能花时间进行更改。通过允许在运行时设置 BinDirectory 字段,您从根本上改变了字段的初始化顺序。您的代码将需要适应。

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

    例如:

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

    【讨论】:

    • 您可能希望将 Path.Combine 的结果“缓存”在字段中。将 BinDir 也更改为一个属性,并对其进行私有设置操作。
    猜你喜欢
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多