首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件/管理员的开销。在getter中存在?

文件/管理员的开销。在getter中存在?
EN

Stack Overflow用户
提问于 2009-02-19 12:52:26
回答 4查看 2.1K关注 0票数 2

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

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

我知道,一般来说,过早地优化是不明智的,但是在我必须返回并从getter中删除它并将其添加到整个位置之前,我希望现在就进行错误检查。

澄清:

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-02-19 15:47:59

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

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

从这个角度来看,您关于实际开销的问题,以及早期的优化,就变得无关紧要了。希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2009-02-19 12:56:43

如果您要重用一个对象,您应该考虑使用FileInfo类与静态文件类。File类的静态方法每次都会执行一次可能不必要的安全检查。

FileInfo - DirectoryInfo - 文件 - 目录

编辑:

我的答案仍然适用。为了确保文件的存在,您可以在getter中这样做:

代码语言:javascript
复制
if(File.Exists(string))
//do stuff
else
//file doesn't exist

代码语言:javascript
复制
FileInfo fi = new FileInfo(fName);
 if (fi.Exists)
//do stuff
else
//file doesn't exist

对,是这样?

我要说的是,如果您在这个逻辑中循环数千次,那么就使用FileInfo实例与静态文件类,因为如果使用静态File.Exits方法,会对性能产生负面影响。

票数 2
EN

Stack Overflow用户

发布于 2009-02-19 13:11:36

如果你那么担心性能(当你说过早优化不是一个好主意时,你是对的),有一些方法可以减轻这一点。如果您认为昂贵的操作是File /O,并且有很多这样的操作,那么您总是可以在类中使用类似字典的东西。考虑以下(相当人为的)示例代码:

代码语言:javascript
复制
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);
  }
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/565192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档