Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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# getter中是否存在文件/目录的开销?_C# - Fatal编程技术网

C# getter中是否存在文件/目录的开销?

C# getter中是否存在文件/目录的开销?,c#,C#,我有一个类,它有几个属性,这些属性引用本地磁盘上的文件/目录位置。这些值可以是动态的,我希望确保在访问它们时,我首先验证它是否存在,而不必在使用这些值的每个方法中包含此代码 我的问题是,把这个放在getter中会导致性能损失吗?它不会在一个循环中被调用数千次,因此这不是一个考虑因素。只是想确保我没有做会造成不必要瓶颈的事情 我知道,一般来说,过早地进行优化是不明智的,但我宁愿现在就进行错误检查,然后再返回,将其从getter中删除并添加到所有地方 澄清: 属性指向的文件/目录将由System.

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

我的问题是,把这个放在getter中会导致性能损失吗?它不会在一个循环中被调用数千次,因此这不是一个考虑因素。只是想确保我没有做会造成不必要瓶颈的事情

我知道,一般来说,过早地进行优化是不明智的,但我宁愿现在就进行错误检查,然后再返回,将其从getter中删除并添加到所有地方


澄清:


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

如果你正在重用一个对象,你应该考虑使用FielFipe类和静态文件类。File类的静态方法每次都可能进行不必要的安全检查。
---

编辑:

我的答案仍然适用。要确保文件存在,请在getter中执行类似操作:

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

对吗


我想说的是,如果您在数千次循环使用此逻辑,那么使用FileInfo实例与静态File类比较,因为如果您使用静态File.Exits方法,将对性能产生负面影响。

如果您担心性能问题(当你说过早优化不是一个好主意的时候,你是对的,有一些方法可以减轻这个问题。如果你认为昂贵的操作是文件I/O,而且你有很多这样的操作,你就可以在课堂上使用类似字典的东西。考虑这个(相当有计划的)示例代码:

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);
  }
}
private Dictionary\u directories=new Dictionary();
私有void检查目录(字符串目录,bool创建)
{
if(_目录.ContainsKey(_目录))
{
bool exists=Directory.exists(Directory);
如果(创建&存在)
{
CreateDirectory(目录);
}
//将目录添加到字典。该值取决于
//该目录以前是否存在或该方法是否已被告知
//创建它。
_目录。添加(目录,创建| |存在);
}
}
稍后,通过迭代此列表添加那些不存在的目录是一件简单的事情

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

    • 你可能已经知道这一点,并接受风险,但只是让你意识到它
  • 如果无论如何都要这样做,那么不管它是否在属性中,检查的粒度是多少(每个操作一次或每个操作组一次)

  • 如果使用非静态FileInfo操作,请注意此对象将在文件系统上缓存其视图

    • 这对您来说可能是一件好事,因为您可以通过Refresh()方法控制缓存刷新的频率,否则可能会导致代码中出现错误
  • 通常在担心性能建议之前先尝试一下,但您表示已经意识到这一点


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

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


    从这个角度看,您关于实际开销是什么以及提前优化的问题变得无关紧要。希望这能有所帮助。

    请参阅我上面的说明。
    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);
      }
    }