代码之家  ›  专栏  ›  技术社区  ›  Ikaso

关于C静态只读成员

  •  2
  • Ikaso  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  3
  •   Juliet    15 年前

    这就是AppConfigs的用途。在你的 AppSettings 节,添加一个名为 BinDirectory . 您可以将您的类重新编写为:

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

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

        2
  •  5
  •   Codesleuth    15 年前

    仅使用“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 但是作为它的有效值。

        3
  •  0
  •   JaredPar    15 年前

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

    如果这是正确的,不幸的是,除了花点时间做出改变之外,你没有什么可以做的。通过允许在运行时设置bindirectory字段,可以从根本上改变字段的初始化顺序。您的代码需要调整。

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

    例如:

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