4

最近の質問Import a VB6 structure into C#では、コードに次のような固定長の文字列が含まれていました。

Name As String *10

C# で固定長文字列を実装する方法についての質問でいくつかの議論があり、可能な方法を提供しました (ただし、どのような形式でも固定長文字列を使用しないことをお勧めします)。しかし、回答の 1 つに VBFixedStringAttribute が記載されていましたが、それ以上の説明はありませんでした。しかし、それに関する情報を探してみると、MSDN や Bing の検索でさえほとんど見つかりませんでした。問題は、「これを実際にどのように使用するか」です。

C# のコード例を見つけることができませんでした。MSDN に VB.NET の最小限の例がありましたが、私の VB.NET のスキルでは何が起こっているのかを理解するには不十分だったので、C# に翻訳することができました。

誰かがVBFixedStringAttributeで何が起こっているのかについての小さなコードと説明を提供できますか?

4

4 に答える 4

2

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;
    }
  }
}

この属性を使用する主な目的は、リフレクションです。リフレクションを使用していて、文字列を返すプロパティを検索している場合は、この属性をチェックして固定文字列かどうかを確認し、Lengthプロパティを呼び出してサイズを取得できます。この属性は、VB.NET でも実際には何もしません。

于 2012-09-26T18:33:46.270 に答える
2

リンクVBFixedStringAttribute Classから気付く重要なことは

VBFixedStringAttribute は情報提供用であり、可変長文字列を固定文字列に変換するために使用することはできません。この属性の目的は、VBFixedStringAttribute を認識するメソッドまたは API 呼び出しによって、構造体および非ローカル変数内の文字列がどのように使用されるかを変更することです。この属性は、文字列自体の実際の長さを変更しないことに注意してください。

VB.Netから C# へ

Structure Person
    Public ID As Integer 
    Public MonthlySalary As Decimal 
    Public LastReviewDate As Long
    <VBFixedString(15)> Public FirstName As String
    <VBFixedString(15)> Public LastName As String
    <VBFixedString(15)> Public Title As String
    <VBFixedString(150)> 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;
}
于 2012-09-26T17:33:26.763 に答える
2

属性には、それを取得するために GetCustomAttributes() を呼び出す別の場所のコードが必要です。このコードは、従来の VB6 I/O サポート メソッドが置かれている Microsoft.VisualBasic 名前空間にあります。特に、静的な FileGet および FilePut 関数にマップされる FileSystem.FileGetObject() および FilePutObject() メソッド。これらのメソッドを C# プログラムから直接使用しても問題はありません。Microsoft.VisualBasic アセンブリへの参照を追加するだけです。

FileGetObject() MSDN ライブラリの記事から:

FileGetObject は、要素間にパディングがないことを除いて、各要素が個別に読み取られているかのように構造体の要素を読み取ります。ディスク上では、ユーザー定義型 (FilePutObject で書き込まれる) の動的配列には、長さが 2 + 8 倍の次元数 (2 + 8 * NumberOfDimensions) に等しい記述子がプレフィックスとして付けられます。FileOpen 関数の RecordLength 句で指定されたレコード長は、個々の要素 (配列とその記述子を含む) を読み取るために必要なすべてのバイトの合計以上である必要があります。VBFixedStringAttribute クラスを構造体の文字列フィールドに適用して、ディスクに書き込むときの文字列のサイズを示すことができます。

于 2012-09-26T17:47:34.100 に答える
1

VB.NETの言語固有の機能(My名前空間、またはあなたの場合はVBFixedStringAttributeなど)を使用するには、Microsoft.VisualBasic.dllへの参照を追加する必要があります。

その後、他の属性として使用できます。ただし、この属性は実際には文字列に影響を与えないことに注意してください。ほとんどの属性と同様に、フィールドを使用するすべての人に、文字列が特定の長さである必要があるという情報を提供するだけです。だから、それを覚えておいてください。文字列の長さと検証について既に話している場合は、コードコントラクトについて読むことをお勧めします:http://msdn.microsoft.com/en-us/library/dd264808.aspx

于 2012-09-26T17:45:46.577 に答える