2014-01-20 47 views
1

代码库中我的工作有使用冗余方法是最佳实践:从外部库

if (!Directory.Exists(dir)) 
{ 
    Directory.CreateDirectory(dir); 
} 

几个例子根据MSDN文档(http://msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx),这是多余的,因为createDirectory不会覆盖一个现有的目录。

这可以被视为使代码更清晰,因为从.CreateDirectory(dir)方法中不明显这是行为。另一方面,这是代码膨胀并且保持它(即使将它添加到库/实用程序类)也有问题(例如,您必须读取/维护更多行代码)。

这里认为最佳实践是什么?

+0

'createDirectory不会覆盖和现有目​​录',虽然这是真的,但是如果目录* does *存在,它仍然会抛出一个异常?我现在没有能力测试它,但我认为'if'是为了防止在这个块上出现'IOException'。 –

+2

@EvanL Nope - 它只是返回没有问题的信息 –

+0

没有'Directory.Exists'代码会导致我暂停和检查它。即使那不是我当时正在处理的事情。我更希望检查能够帮助开发人员阅读代码,认为这里没有任何东西可以看到。 – cgTag

回答

2

它可能看起来多余,但我可以看到有人决定走这条路的原因。

的主要区别是:

  • Directory.Exists()回报只是bool
  • Directory.CreateDirectory()回报DirectoryInfo

所以即使在目录中存在,存在执行吃出DirectoryInfo情况下,额外的工作,这可能根本不需要。

出现的另一件事是,你必须知道,Directory.CreateDirectory不覆盖目录,如果它存在!即使有人不知道他可以很容易地弄清楚这段代码是怎么回事,也可以拨打Directory.Exists。我不认为这里有best practice

2

就我个人而言,我通常会删除多余的代码。

这可以被看作是使代码更清晰,因为从.CreateDirectory(dir)方法中不明显,这是行为。

总的来说,我认为通过评论会更好,而不是冗余代码路径。添加额外的代码以避免缺乏知识似乎是包含检查的一个薄弱的理由。

这就是说,在避免调用CreateDirectory时会有潜在的(非常小的)性能增益,因为该方法将构造一个DirectoryInfo实例。在实践中,这很可能是“噪音”(因为无论如何,IO调用往往相对昂贵),所以它不是我会考虑到等式中的东西,除非它被证明是一个衡量问题。

+0

我完全同意那些看起来很奇怪的评论代码(为什么前面的程序员不检查这个目录是否先存在?)对于没有完全理解方法内部工作的人来说总是一个好习惯。 –

0

即使初步检查已通过,竞争条件也可能导致创建目录失败。 因此,我认为这段代码不正确,我劝你不要使用它。

+0

我同意 - 除非在这种情况下,只要您尝试*使用*目录就会出现相同的竞争条件 - 在这种情况下,真正的问题会发生在文件写入上(就像它应该) 。 –

+0

'Directory.CreateDirectory()'如何防止竞争条件?在创建之前,它在内部仍然存在检查。 – DaveShaw

+0

@DaveShaw:.NET“CreateDirectory”在内部调用本机Win32函数“CreateDirectory”,如果指定的目录已存在,则返回ERROR_ALREADY_EXISTS。 –