C# getter中是否存在文件/目录的开销?
我有一个类,它有几个属性,这些属性引用本地磁盘上的文件/目录位置。这些值可以是动态的,我希望确保在访问它们时,我首先验证它是否存在,而不必在使用这些值的每个方法中包含此代码 我的问题是,把这个放在getter中会导致性能损失吗?它不会在一个循环中被调用数千次,因此这不是一个考虑因素。只是想确保我没有做会造成不必要瓶颈的事情 我知道,一般来说,过早地进行优化是不明智的,但我宁愿现在就进行错误检查,然后再返回,将其从getter中删除并添加到所有地方C# getter中是否存在文件/目录的开销?,c#,C#,我有一个类,它有几个属性,这些属性引用本地磁盘上的文件/目录位置。这些值可以是动态的,我希望确保在访问它们时,我首先验证它是否存在,而不必在使用这些值的每个方法中包含此代码 我的问题是,把这个放在getter中会导致性能损失吗?它不会在一个循环中被调用数千次,因此这不是一个考虑因素。只是想确保我没有做会造成不必要瓶颈的事情 我知道,一般来说,过早地进行优化是不明智的,但我宁愿现在就进行错误检查,然后再返回,将其从getter中删除并添加到所有地方 澄清: 属性指向的文件/目录将由System.
澄清:
属性指向的文件/目录将由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(目录);
}
//将目录添加到字典。该值取决于
//该目录以前是否存在或该方法是否已被告知
//创建它。
_目录。添加(目录,创建| |存在);
}
}
稍后,通过迭代此列表添加那些不存在的目录是一件简单的事情
- 你可能已经知道这一点,并接受风险,但只是让你意识到它
- 这对您来说可能是一件好事,因为您可以通过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);
}
}