Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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# 我们为什么要在Directory.EnumerateFiles()上使用Directory.GetFiles()呢?_C#_System.io.directory - Fatal编程技术网

C# 我们为什么要在Directory.EnumerateFiles()上使用Directory.GetFiles()呢?

C# 我们为什么要在Directory.EnumerateFiles()上使用Directory.GetFiles()呢?,c#,system.io.directory,C#,System.io.directory,我不知道为什么我们会使用Directory.GetFiles作为ifDirectory.EnumerateFiles将能够做同样的事情,并且您甚至可以在返回找到的整个目录列表之前枚举列表 为什么,既然EnumerateFiles可用,是否需要使用GetFiles?根据以下内容: EnumerateFiles和GetFiles方法的区别如下: 使用EnumerateFiles,可以开始枚举名称集合 在归还全部藏品之前;当您使用GetFiles时 必须等待返回整个名称数组,然后才能 访问阵列。因此

我不知道为什么我们会使用
Directory.GetFiles
作为if
Directory.EnumerateFiles
将能够做同样的事情,并且您甚至可以在返回找到的整个目录列表之前枚举列表

为什么,既然
EnumerateFiles
可用,是否需要使用
GetFiles

根据以下内容:

EnumerateFiles和GetFiles方法的区别如下: 使用EnumerateFiles,可以开始枚举名称集合 在归还全部藏品之前;当您使用GetFiles时 必须等待返回整个名称数组,然后才能 访问阵列。因此,当您处理许多文件和 目录、枚举文件可以更高效


我想
GetFiles
可以看作是一个方便的函数。

这两个方法最终都会调用System.IO.filesystemnumerablefactory.CreateFileNameIterator()。唯一的区别似乎是GetFiles()结果被包装在一个列表中,然后变成一个数组。因此,正如在其他一些答案中提到的,区别在于枚举数已经通过GetFiles()进行了遍历,而EnumerateFiles在遍历之前为您提供了枚举数


作为参考,我可以使用ILSpy()找到它。

您可以为正确的工作使用正确的工具。如果您有少量文件,那么您可能只想使用
Directory.GetFiles()
并将它们加载到内存中

Directory.EnumerateFiles()
另一方面,您需要通过一次枚举一个文件来节省内存

这类似于是否制造一切,或者在适当的时候使用它的争论。我认为这有助于正确看待事物,因为无缘无故地让一切都变得懒惰是过分的

您需要在简单性与效率之间进行权衡。从概念上讲,枚举器实际上并不包含这些文件,但一次只能生成一个文件,这比字符串数组更复杂。能够将该枚举数存储在
IEnumerable
中是一个很好的抽象,但重点仍然是

预测性能也可能更加困难。使用
GetFiles()
您知道调用该方法时会产生性能成本<代码>枚举文件()在枚举之前不会执行任何操作

意图很重要。如果您在一个您知道不会有那么多文件的目录上使用
EnumerateFiles()
,那么您只是盲目地使用它而不理解它。代码运行的计算机也有问题。如果我在内存为24 GB的服务器上运行某个程序,那么与在内存为1 GB的服务器上运行相比,我可能更倾向于使用内存不足的方法,如
GetFiles()

如果您不知道将有多少个文件,或者不确定代码将在什么样的环境中运行,那么明智的做法是谨慎行事,使用内存效率高的版本


“有很多变量需要考虑,一个好的程序员把这些事情考虑进去,并有目的地做事情。”根据MSDN的Gr.W.GruttWiNeNi说,GetFiles没有被贬低。它看起来更像是一个方便的函数。虽然我没有看到关于它的明确声明。因此,本质上,
GetFiles()
相当于
EnumerateFiles().ToList()
@dwerner:实际上,查看,
GetFiles()
最终调用等效的
EnumerateFiles
(如果我读得正确),然后调用:
新列表(file迭代器).ToArray()
。如果我理解正确,这会产生两个O(n)操作,而
EnumerateFiles().ToList()
只会产生一个。@Chris Sinclair-Ouch,更糟。不过需要注意一点。如果您在文件夹中执行文件操作(例如重命名文件),同一文件可能会被处理为多个文件,因为当枚举器遍历目录时,它会再次被“捕获”。实际上,对于BCL中的许多类,您可以通过联机查看源代码;这里不需要ILSpy。
GetFiles
用于向后兼容。它是在最初的1.0.NET框架中
EnumerateFiles
的引入要晚得多——如果我没记错的话,是4.0或4.5。@Enigmativity
GetFiles
是在2.0中引入的,而
EnumerateFiles
是在4.0中引入的。@Despertar-感谢您的澄清。