Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多次读取一个值或第一次将其存储为变量?_C#_Variable Assignment - Fatal编程技术网

C# 多次读取一个值或第一次将其存储为变量?

C# 多次读取一个值或第一次将其存储为变量?,c#,variable-assignment,C#,Variable Assignment,基本上,在第一次运行时将值存储到变量中是更好的做法,还是继续使用该值?代码将更好地解释它: TextWriter tw = null; if (!File.Exists(ConfigurationManager.AppSettings["LoggingFile"])) { // ... tw = File.CreateText(ConfigurationManager.AppSettings["LoggingFile"]); } 或 清晰很重要,干爽(不要重复)很重要。这是一个微观

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

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


清晰很重要,干爽(不要重复)很重要。这是一个微观抽象——在变量后面隐藏一个小的但仍然重要的功能。性能可以忽略不计,但清晰度的积极影响不能低估。获取值后,请使用一个名称良好的变量保存该值。

第二种解决方案更适合我,因为:

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

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

第二个将是最佳选择

想象下一种情况。设置由其他线程更新,在其中一些线程中,由于设置值未锁定,因此会更改为另一个值

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


另一个好处是您不会两次检索该值。您只需要一次,然后在代码需要读取整个设置的地方使用它。

我敢肯定,第二个更具可读性。但若你们谈论性能,不要在早期阶段和并没有分析器的情况下进行优化。

我必须同意其他人的观点。可读性和干性很重要,而且考虑到通常只有对象,而不是多次真正存储对象,变量的成本非常低

特殊或大型对象可能会有例外。您必须记住这样一个问题:缓存的值是否会在这段时间内发生变化,以及您是否希望(大多数情况下是第二次!)知道代码中的新值!在您的示例中,考虑当ConfigurationManager.AppSettings[“LoggingFile”]在两次调用之间发生更改时(由于访问器逻辑或线程或总是从磁盘读取文件中的值),可能会发生什么情况


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

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

若要补充这一点,当您有单独的赋值语句时,它有助于在错误情况下进行调试。e、 g.如果变量的值无效并导致错误/异常,您可以在某处使用它之前进行检查。
TextWriter tw = null;
string logFile = ConfigurationManager.AppSettings["LoggingFile"].ToString();
if (!File.Exists(logFile))
{
    // ...
    tw = File.CreateText(logFile);
}