在VB.NET中工作一段时间后,我想摆脱Microsoft.VisualBasic依赖 由于文本文件和字符串操作在这里很容易,我不知道该怎么做。
是否可以在VB.NET中编写等效代码而不使用Microsoft.VisualBasic命名空间以及此代码的外观如何?
Dim fnum As Integer = FreeFile()
FileOpen(fnum, "Setup\myadmin", OpenMode.Random, OpenAccess.ReadWrite, OpenShare.Shared, Len(idstruct))
FilePut(fnum, idstruct, 1) 'structure data to file in record 1
FileClose(fnum)
答案 0 :(得分:2)
尽管我同情你希望删除对Microsoft.VisualBasic
命名空间的所有引用,并且尽管我认为这样做有价值,但有时它不值得麻烦。命名空间确实包含一些有用的工具,没有它就不容易复制。
例如,我会想到TextFieldParser
。它允许您轻松读取CSV和固定宽度的文件。在.NET框架中没有类似的其他类。那么,重新发明轮子是否值得你不引用Microsoft.VisualBasic
命名空间?我认为这不值得。
虽然可以使用FileGet
和FilePut
,FileStream
,StreamReader
重现StreamWriter
和BinaryReader
的行为,和BinaryWriter
课程,可能不值得一切麻烦。 FileGet
和FilePut
方法专门针对向后兼容性提供,因此,如果与旧系统的兼容性是您的目标,那么使用FileGet
和{{1是一个合适的解决方案。
但是,这些建议中的一些取决于数据类型。例如,如果结构只包含固定宽度的字符串,那么使用FilePut
和StreamReader
或StreamWriter
很容易复制。或者,如果它只包含整数,那么使用TextFieldParser
和BinaryReader
可能很容易重现。
但是,即使您可以使用其他非VB专用类轻松地重现逻辑,这样做也无法获得任何好处。事实上,您的代码将更复杂,并且自我记录会更少。当您使用BinaryWriter
和FileGet
查看代码时,不仅可以轻松判断正在执行的操作,而且显而易见的是它是为了向后兼容。如果用自己的逻辑替换它们,那么在不向代码添加注释的情况下,向后兼容性的必要性就不那么明显了。
如果您不喜欢看它们,我当然可以理解,可能值得将它们包装在包装类中。例如,您可以使用加载/保存方法创建数据访问样式类,该方法在内部仅使用FilePut
和FileGet
。无论如何,这样做是好的做法。这样,如果您选择以不同的格式或不同的数据源(例如数据库)存储数据,您可以在一个类中更改它而无需重写所有代码。
答案 1 :(得分:1)
我刚发现的另一件事就是这个关于My.Computer.FileSystem的MSDN页面:
http://msdn.microsoft.com/en-us/library/0b485hf7%28v=vs.90%29.aspx
我发现的是从FilePut上的MSDN页面引用的:
http://msdn.microsoft.com/en-us/library/0s9sa1ab%28v=vs.90%29.aspx
来自帖子like this one我的理解是,它只是System.IO的包装器,但它应该为底层IO功能提供“更方便,更易理解”的接口。
答案 2 :(得分:0)
如果您指的是使用LEN()函数(这是我唯一可以看到引用Microsoft.VisualBasic命名空间的东西,除非我遗漏了某些内容),那么您可以使用String.Length代替。例如。 idstruct.Length,假设idstruct是一个String。
答案 3 :(得分:0)
看看System.IO.FileStream
。方法略有不同,但很简单。
Dim fs As New FileStream(mUserFile, FileMode.XXX, FileAccess.XXX)
或:
Using fs as New FileStream....
End Using
要改变的主要事情是,不是编写结构,而是将其转换为字节数组(Count将是数组的长度,在您的示例中偏移0):
fs.Write(byt(), lOffset, lCount)
你可以将它全部包装在一个类中,以模拟旧的随机访问文件方法,如果有很多遗留代码需要支持的话。还有一个BinaryReader
和BinaryWriter
,如果数据很大但是大部分是静态的,你也可以查看序列化。