【问题标题】:Read a value multiple times or store as a variable first time round?多次读取一个值或第一次存储为变量?
【发布时间】:2011-02-02 10:42:10
【问题描述】:

基本上,最好在第一次运行时将值存储到变量中,还是继续使用该值?代码会更好地解释它:

TextWriter tw = null;
if (!File.Exists(ConfigurationManager.AppSettings["LoggingFile"]))
{
   // ...
   tw = File.CreateText(ConfigurationManager.AppSettings["LoggingFile"]);
}

TextWriter tw = null;
string logFile = ConfigurationManager.AppSettings["LoggingFile"].ToString();
if (!File.Exists(logFile))
{
    // ...
    tw = File.CreateText(logFile);
}

【问题讨论】:

    标签: c# variable-assignment


    【解决方案1】:

    清晰很重要,DRY(不要重复自己)很重要。这是一个微抽象——在变量后面隐藏了一个很小但仍然很重要的功能。性能可以忽略不计,但清晰度的积极影响不容小觑。获取值后,使用命名良好的变量来保存值。

    【讨论】:

    • 补充一点,当你有一个单独的语句来分配值时,它有助于在错误场景中进行调试。例如如果变量的值无效并导致错误/异常,您可以在某处使用它之前检查它。
    【解决方案2】:

    第二种解决方案对我来说更好,因为:

    • 字典查找是有代价的
    • 更具可读性

    或者您可以拥有一个带有私有构造函数的单例对象,该构造函数会一次性填充您需要的所有配置数据。

    【讨论】:

      【解决方案3】:

      第二个是最好的选择。

      想象一下接下来的情况。设置由其他线程更新,并且在其中一些线程期间,由于设置值未锁定,因此更改为另一个值。

      在第一种情况下,您的执行可能会失败,或者可以正常执行,但代码正在检查某个名称的文件,然后将任何内容保存到之前未检查的文件中。这太糟糕了,不是吗?

      另一个好处是您不会两次检索该值。你得到一次,你可以在你的代码需要读取整个设置的地方使用。

      【讨论】:

        【解决方案4】:

        我很确定,第二个更具可读性。但是,如果您谈论性能 - 不要在没有分析器的情况下在早期阶段进行优化。

        【讨论】:

          【解决方案5】:

          我必须同意其他人的观点。可读性和 DRY 很重要,考虑到您通常只有 Objects 而不会真正多次存储该东西,因此变量的成本非常低。

          特殊或大型对象可能存在例外情况。您必须牢记这个问题,如果您缓存的值可能会在两者之间发生变化,以及您是否愿意(大多数时候是第二个!)知道代码中的新值!在您的示例中,请考虑当 ConfigurationManager.AppSettings["LoggingFile"] 在两个调用之间发生更改时(由于访问器逻辑或线程或始终从磁盘读取文件中的值)可能会发生什么。

          简历:大约 99% 你会想要第二种方法/缓存!

          【讨论】:

            【解决方案6】:

            IMO 取决于您尝试缓存的内容。从 App.conig 缓存设置可能不如通过 GPRS 连接缓存 Web 服务调用的结果有益(除了代码可读性)。

            【讨论】:

              猜你喜欢
              • 2013-12-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-10
              • 1970-01-01
              • 1970-01-01
              • 2015-07-16
              • 2018-03-26
              • 1970-01-01
              相关资源
              最近更新 更多