将VB6结构导入C#

时间:2012-09-25 23:23:33

标签: c# struct vb6 vb6-migration

我的任务是将一些遗留代码转换为新系统,我们在这里有一些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

2 个答案:

答案 0 :(得分:3)

您可能对VBFixedStringAttributeVBFixedArrayAttribute感兴趣,但它们仅在少数地方使用。

另请参阅this questionthis question

答案 1 :(得分:3)

关于固定长度的字符串,yikes。它不会发生,因为没有相应的结构。除非Jon Skeet或Anders Hejlsberg知道不同并且可以用来衡量 - 我不认为即使他们知道一种方式,因为没有一种,我很确定。

另一方面,固定长度的弦绝对是撒旦的。这就是为什么他们没有将它们包含在.NET中。 : - )

如果您问我 I 如何将上述MapRec对象转换为C#中可用的东西,那么您可以在结构和类之间进行选择。就个人而言,我不喜欢结构。如果你使用了一个类,那么你可以通过你的setter和getter实现一种卑鄙的固定字符串。如本例所示,我将如何实现Type 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可以完成这项工作),否则我建议远离它们。