2

私はいくつかのレガシーコードを新しいシステムに変換する任務を負っており、ここにいくつかのVB6構造があります。それらをC#構造に簡単に変換する方法はありますか?

C#で構造を再定義することはできますが、C#には固定文字列がありません。(または多分私は誤解しています)

正しい方向に何か製品はありますか?

Private Type MapRec
    Name As String * NAME_LENGTH
    Revision As Long
    Moral As Byte
    Up As Integer
    Down As Integer
    Left As Integer
    Right As Integer
    Music As String
    BootMap As Integer
    BootX As Byte
    BootY As Byte
    Tile() As TileRec
    Npc(1 To MAX_MAP_NPCS) As Integer
    NpcSpawn(1 To MAX_MAP_NPCS) As SpawnRec
    TileSet As Integer
    Region As Byte
End Type
4

2 に答える 2

3

VBFixedStringAttributeとVBFixedArrayAttributeに興味があるかもしれませんが、これらはいくつかの場所でしか使用されていません。

この質問この質問も参照してください。

于 2012-09-25T23:42:23.647 に答える
3

固定長の文字列に関しては、yikes。同等の構成がないため、これは発生しません。JonSkeetまたはAndersHejlsbergが別の方法で知っていて、計量するために呼び出すことができない限り、彼らが方法を知っているとは思いません。

一方、固定長の文字列は絶対に悪魔的です。そのため、.NETには含まれていませんでした。:-)

上記のMapRecオブジェクトをC#で使用できるものに変換する方法尋ねられた場合は、構造体とクラスのどちらかを選択できます。個人的に、私は構造体が嫌いです。クラスを使用した場合は、セッターとゲッターを使用して、一種のろくでなしの固定文字列を実装できます。この例に見られるように、これは私があなたのタイプMapRecを実装する方法です:

public class MapRec
{
    private const int MAX_MAP_NPCS = 25;
    private int fixedLength1 = 10;
    private string _name;

    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            if (value.Length != fixedLength1)
            {
                if (value.Length < fixedLength1)
                {
                    _name = value.PadRight(fixedLength1);
                }
                else
                {
                    _name = value.Substring(0,fixedLength1);
                    // or alternatively throw an exception if 
                    // a 11+ length string comes in
                }
            }
            else
            {
                _name = value;
            }
        }
    }

    // Constructor
    public MapRec()
    {
        Npc = new int[MAX_MAP_NPCS];
        NpcSpawn = new SpawnRec[MAX_MAP_NPCS];
    }

    public long Revision { get; set; }
    public byte Moral { get; set; }
    public int Up { get; set; }
    public int Down { get; set; }
    public int Left { get; set; }
    public int Right { get; set; }
    public string Music { get; set; }
    public int BootMap { get; set; }
    public byte BootX { get; set; }
    public byte BootY { get; set; }
    public TileRec[] Tile { get; set; }
    public int[] Npc { get; set; }
    public SpawnRec[] NpcSpawn { get; set; }
    public int TileSet { get; set; }
    public byte Region { get; set; }
}

結局、実際に固定長の文字列が必要な場合(そしておそらくMicrosoft.VisualBasic.VBFixedStringAttributeがその仕事をすることができる場合)を除いて、私はそれらから離れることをお勧めします。

于 2012-09-26T00:10:20.627 に答える