文件/目录的开销。在getter中存在?

时间:2009-02-19 12:52:26

标签: c#

我有一个类,它有几个属性引用本地磁盘上的文件/目录位置。这些值可以是动态的,我想确保在访问它们的任何时候,我首先验证它是否存在,而不必在每个使用这些值的方法中包含此代码。

我的问题是,将此放入吸气器会导致性能下降吗?它不会在循环中被调用数千次,因此这不是一个考虑因素。只是想确保我没有做一些会导致不必要的瓶颈的事情。

我知道通常过早地优化是不明智的,但我宁愿在我必须返回并将其从吸气剂中移除并将其全部添加到该位置之前检查到此错误。


澄清:

属性指向的文件/目录将由System.Diagnostics.Process使用。我不会直接读/写这些文件/目录,我只是想在生成子进程之前确保它们存在。

4 个答案:

答案 0 :(得分:3)

任何不是简单查找或计算的东西都应该放在方法中,而不是属性中。属性应该在概念上类似于只访问字段 - 如果有任何额外的开销或失败的可能性(并且IO - 甚至只是检查文件存在 - 将在两个计数上都失败),那么属性不是正确的选择。

请记住,在查看对象状态时,调试器甚至会调用属性。

从这个角度来看,你关于实际开销和早期优化的问题变得无关紧要。希望这会有所帮助。

答案 1 :(得分:2)

如果要重用对象,则应考虑使用FileInfo类与静态File类。 File类的静态方法每次都会进行不必要的安全检查 FileInfo - DirectoryInfo - File - Directory

修改

我的回答仍然适用。为确保您的文件存在,您可以在getter中执行类似的操作:

if(File.Exists(string))
//do stuff
else
//file doesn't exist

OR

FileInfo fi = new FileInfo(fName);
 if (fi.Exists)
//do stuff
else
//file doesn't exist

正确?

我所说的是,如果您循环使用此逻辑数千次,则使用 FileInfo 实例VS静态文件类,因为您将获得负面效果如果您使用静态 File.Exits 方法,则会产生影响。

答案 2 :(得分:2)

如果你担心性能问题(当你说过早优化不是一个好主意时你是对的),有很多方法可以缓解这种情况。如果您认为昂贵的操作是文件I / O并且您有很多这样的操作,那么您总是可以在类中使用像Dictionary这样的东西。考虑这个(相当人为的)示例代码:

private Dictionary<string, bool> _directories = new Dictionary<string, bool>();

private void CheckDirectory(string directory, bool create)
{
  if (_directories.ContainsKey(_directories))
  {
    bool exists = Directory.Exists(directory);
    if (create && !exists)
    {
      Directory.CreateDirectory(directory);
    }
    // Add the directory to the dictionary. The value depends on
    // whether the directory previously existed or the method has been told
    // to create it.
    _directories.Add(directory, create || exists);
  }
}

稍后通过迭代此列表来添加那些不存在的目录是一件简单的事情。

答案 3 :(得分:2)

  1. 路径在检查点存在是可行的,但是在路径和操作之间移动/删除。

    • 您可能已经知道这一点并接受风险,但只是让您意识到这一点。
  2. 如果您打算这样做,无论是否属于某个属性都无关紧要,只需检查您的检查粒度(每次操作一次或每组操作一次)

    < / LI>
  3. 如果使用非静态FileInfo操作,请注意此对象将缓存其在文件系统上的视图。

    • 这对您来说可能是件好事,因为您可以通过Refresh()方法控制缓存刷新的频率,或者可能导致代码中的错误。
  4. 在担心性能建议之前,通常先尝试一下,但是你表示你知道这一点。