Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.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
.net My.Computer.FileSystem和System.IO.File之间到底有什么区别_.net_Vb.net_Visual Studio_Namespaces_Coding Style - Fatal编程技术网

.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用户,我会使用这些方法,因为它们更接近您所期望的行为。否则,我将坚持使用标准的.NETAPI
System.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