如何在C#中使用VBFixedStringAttribute?

在最近的一个问题中, 将VB6结构导入C# ,代码包含一个固定长度的字符串,类似于:

Name As String *10 

关于如何在C#中实现固定长度字符串的问题中有一些讨论,我提供了一种可能的方法(尽管我建议不要使用任何forms的固定长度字符串)。 但是,其中一个答案提到了VBFixedStringAttribute,没有进一步的解释,我很想知道那是什么。 但是,当我去寻找它的一些信息时,我在MSDN上甚至在Bing搜索中都找不到。 那么问题是“一个人如何实际使用它?”

我找不到C#代码示例,虽然在MSDN上有一个最小的VB.NET示例 ,我的VB.NET技能不足以弄清楚它是怎么回事,所以我可以把它翻译成C#。

有人可以提供一些代码和解释VBFixedStringAttribute发生了什么?

我认为从VBFixedStringAttribute类链接中注意到的重要事项是

VBFixedStringAttribute是信息性的,不能用于将可变长度字符串转换为固定字符串。 此属性的目的是修改结构和非局部变量中的字符串如何被识别VBFixedStringAttribute的方法或API调用使用。 请记住,此属性不会更改字符串本身的实际长度。

从VB.Net到C#

 Structure Person Public ID As Integer Public MonthlySalary As Decimal Public LastReviewDate As Long  Public FirstName As String  Public LastName As String  Public Title As String  Public ReviewComments As String End Structure 

是相同的

 using Microsoft.VisualBasic; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; struct Person { public int ID; public decimal MonthlySalary; public long LastReviewDate; [VBFixedString(15)] public string FirstName; [VBFixedString(15)] public string LastName; [VBFixedString(15)] public string Title; [VBFixedString(150)] public string ReviewComments; } 

任何属性都需要在其他地方调用GetCustomAttributes()来检索它。 该代码位于Microsoft.VisualBasic命名空间中,即旧版VB6 I / O支持方法所在的位置。 特别是FileSystem.FileGetObject()和FilePutObject()方法,它们映射到静态FileGet和FilePut函数。 直接从C#程序使用这些方法不是问题,只需添加对Microsoft.VisualBasic程序集的引用即可。

从FileGetObject()MSDN Library文章:

FileGetObject读取结构的元素,就好像每个元素都被单独读取一样,除了元素之间没有填充。 在磁盘上,用户定义类型(用FilePutObject编写)的动态数组以一个描述符为前缀,该描述符的长度等于维数的2加8倍:2 + 8 * NumberOfDimensions。 FileOpen函数中RecordLength子句指定的记录长度必须大于或等于读取各个元素(包括任何数组及其描述符)所需的所有字节的总和。 VBFixedStringAttribute类可以应用于结构中的字符串字段,以指示写入磁盘时字符串的大小。

VBFixedStringAttribute没什么特别的。 它的定义如下:

 namespace Microsoft.VisualBasic { [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] public sealed class VBFixedStringAttribute : Attribute { private int m_Length; public int Length { get { return this.m_Length; } } public VBFixedStringAttribute(int Length) { if (Length < 1 || Length > (int) short.MaxValue) throw new ArgumentException(Utils.GetResourceString("Invalid_VBFixedString")); this.m_Length = Length; } } } 

使用此属性的主要目的是出于reflection目的。 如果您正在使用reflection并且正在搜索返回字符串的属性,则可以检查此属性以查看其是否为固定字符串,并且可以调用Length属性来获取大小。 即使在VB.NET中,这个属性也没有任何作用。

为了使用VB.NET的语言特定function(如我的命名空间,或者在你的情况下 – VBFixedStringAttribute),你必须添加对Microsoft.VisualBasic.dll的引用

之后,您可以将其用作任何其他属性。 但要记住,这个属性并没有真正影响字符串 – 就像大多数属性一样,它只是向任何打算使用该字符串应该具有特定长度的字段的人提供信息。 所以记住这一点。 如果我们已经在讨论字符串长度和validation,建议阅读代码契约: http : //msdn.microsoft.com/en-us/library/dd264808.aspx