我有一个类,它有几个属性引用本地磁盘上的文件/目录位置。这些值可以是动态的,我希望确保在任何时候访问它们,我首先验证它是否存在,而不必在每个使用这些值的方法中包含此代码。
我的问题是,把它放进getter会招致性能上的损失吗?它不会在一个循环中被调用数千次,所以这不是一个考虑因素。只是想确保我没有做会导致不必要的瓶颈的事情。
我知道,一般来说,过早地优化是不明智的,但是在我必须返回并从getter中删除它并将其添加到整个位置之前,我希望现在就进行错误检查。
澄清:
属性指向的文件/目录将由System.Diagnostics.Process使用。我不会直接读/写这些文件/目录,我只想在生成子进程之前确保它们的存在。
发布于 2009-02-19 15:47:59
任何不是简单的查找或计算的东西都应该放在方法中,而不是属性中。属性在概念上应该类似于仅仅访问一个字段--如果有任何额外的开销或失败的机会(而IO --甚至只是检查一个文件--在这两方面都会失败),那么属性就不是正确的选择。
请记住,在查看对象状态时,调试器甚至会调用属性。
从这个角度来看,您关于实际开销的问题,以及早期的优化,就变得无关紧要了。希望这能有所帮助。
发布于 2009-02-19 12:56:43
如果您要重用一个对象,您应该考虑使用FileInfo类与静态文件类。File类的静态方法每次都会执行一次可能不必要的安全检查。
FileInfo - DirectoryInfo - 文件 - 目录
编辑:
我的答案仍然适用。为了确保文件的存在,您可以在getter中这样做:
if(File.Exists(string))
//do stuff
else
//file doesn't exist或
FileInfo fi = new FileInfo(fName);
if (fi.Exists)
//do stuff
else
//file doesn't exist对,是这样?
我要说的是,如果您在这个逻辑中循环数千次,那么就使用FileInfo实例与静态文件类,因为如果使用静态File.Exits方法,会对性能产生负面影响。
发布于 2009-02-19 13:11:36
如果你那么担心性能(当你说过早优化不是一个好主意时,你是对的),有一些方法可以减轻这一点。如果您认为昂贵的操作是File /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);
}
}稍后通过迭代这个列表来添加那些不存在的目录是很简单的事情。
https://stackoverflow.com/questions/565192
复制相似问题