.net My.Computer.FileSystem和System.IO.File之间到底有什么区别
.net My.Computer.FileSystem和System.IO.File之间到底有什么区别,.net,vb.net,visual-studio,namespaces,coding-style,.net,Vb.net,Visual Studio,Namespaces,Coding Style,My.Computer.FileSystem和System.IO.File名称空间中存在大量重复的函数 那么,这两者之间的区别到底是什么: My.Computer.FileSystem.CopyFile(source, dest, True) 以及: 是否存在性能差异?每个人对哪一个在阅读能力上有优势的看法是什么?我个人使用My.Computer名称空间,但现在这只是一种习惯。My.*只是为VB.NET实现的一组facade模式类,包含公共System.IO*(和其他)操作。由于您正在经历一个
My.Computer.FileSystem
和System.IO.File
名称空间中存在大量重复的函数
那么,这两者之间的区别到底是什么:
My.Computer.FileSystem.CopyFile(source, dest, True)
以及:
是否存在性能差异?每个人对哪一个在阅读能力上有优势的看法是什么?我个人使用
My.Computer
名称空间,但现在这只是一种习惯。My.*只是为VB.NET实现的一组facade模式类,包含公共System.IO*(和其他)操作。由于您正在经历一个额外的抽象层,所以性能受到的影响非常小,但您必须决定是否值得为此进行优化。我建议您和您店里的其他人使用任何有意义的方式
如果您使用.NET Reflector检查My.Computer.FileSystem.CopyFile
的代码,您将看到该方法包装了许多System.IO类,例如File和Directory,尤其是File类的Copy、Move和Delete方法。片段:
'lots of other code snipped out for brevity and to show the use of System.IO classes...
Directory.CreateDirectory(FileSystem.GetParentPath(str))
'snip
If
' snip
Else
File.Delete(str)
File.Move(path, str)
End If
Else
File.Move(path, str)
End If
End Sub
实际上什么都没有
My.Computer
被添加到VB中,作为底层函数更方便、更容易理解的抽象层。它的一些方法添加了新功能,在我看来,这将是唯一一次在System.IO.File
上使用它
My.Computer
将在System.IO.File
上添加功能的示例是该方法,其中它能够向用户显示对话框:
如果showUI设置为True,则会显示一个对话框
显示项目的进度
活动该对话框包含一个
“取消”按钮,可用于
取消操作。对话框
不是模态的,因此不是模态的
阻止用户输入到中的其他窗口
节目
如果您已经在某些地方使用了
System.IO.File
,出于一致性原因,我强烈建议您不要在上面使用My.Computer
。也就是说,不要在My.Computer
和System.IO.File
中混合调用方法,只使用一个名称空间 My命名空间是一个VB.Net构造,其部分目的是作为VB6和.Net API之间的桥梁。这些方法倾向于使用VB6语义+外观
如果您是一个正在转换到.Net的VB6用户,我会使用这些方法,因为它们更接近您所期望的行为。否则,我将坚持使用标准的.NETAPISystem.IO.File.Copy
编辑
有几个人质疑我是否将My
名称空间误认为是Microsoft.VisualBasic
名称空间。我不是。My
名称空间有很多功能,但它的一项功能是将某些调用包装到方法中,然后转发到Microsoft.VisualBasic
。例如,如果在VB.net项目中键入以下代码
My.Computer.FileSystem.CopyFile(source, dest)
它将导致以下一组事件
- 对MyProject.Computer.FileSystem.CopyFile的调用将嵌入到应用程序中
- 将在程序集中生成类型
和MyProject
MyComputer
类型只是从MyComputer
Microsoft.VisualBasic.Devices.Computer
- 因此,
方法解析为FileSystem.CopyFile
,它只需转发到FileSystemProxy.CopyFile
FileSystem.CopyFile
System.IO.Directory.Delete
及
方法,有相当重要的区别
使用
如果目录不为空,将引发“System.IO.IOException”。但是,
FileSystem.DeleteDirectory
默认操作是继续并删除文件,除非包含附加参数
这是从
公共共享子DeleteDirectory(目录为字符串,onDirectoryNotEmpty为DeleteDirectoryOption
)
参数目录
类型:要删除的System.String目录。
onDirectoryNotEmpty
类型:
Microsoft.VisualBasic.FileIO.DeleteDirectoryOption
指定当要删除的目录包含文件或目录时应执行的操作。默认值为DeleteDirectoryOption.DeleteAllContents
另一个选项是指定DeleteDirectoryOption.throwifdirectoryNoneEmpty
还有其他的区别,但对我来说,这一点非常突出。这里有一个由应用程序故障引起的区别: My.Computer.FileSystem.WriteAllText在文件开头插入一个3字节的BOM(EF BB BF),system.io.file则不插入
因此,我用system.io.file.writealText替换了我的.Computer.FileSystem.writealText,这就解决了问题。谢谢你的回答。只有我“在我的店里”,所以我可以决定我喜欢什么,但我对人们的喜好有点感兴趣。JIT编译使得即使是“微小的性能影响”也不太可能引人注目。我不经常使用
我的
类,只是出于一致性的原因,但是如果您觉得方便的话,使用它绝对没有错。这就是关键所在,在普通情况下加快开发。@Cody:在所有方面都同意。根据您的反馈,我编辑并向tiny添加了限定符very
。“我的.Computer
被添加到VB初学者版”–胡说八道。这从来不是规定的用途。相反,它是一个方便层,没有任何东西反对使用它。但有点遗憾的是,有些功能是完全重复的。它为用户抽象了一些功能,这一事实使它成为初学者使用的关键项目。它不仅仅是一个方便层,它还通过System.IO.*
为某些方法提供了额外的功能。我从来没有想过我关于初学者的陈述会像我写的那样直接。请看我编辑过的答案,希望这能更好地表达我的观点。“实际上什么都没有”,除了my.Com
FileSystem.DeleteDirectory
System.IO.Directory.Delete
FileSystem.DeleteDirectory