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

关于固定长度的字符串,哎呀。这不会发生,因为没有等效的构造。除非 Jon Skeet 或 Anders Hejlsberg 知道的不同,并且可以被援引来衡量——我认为即使他们知道方法,因为没有方法,我很确定。

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

如果您要问我如何上述 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 可以完成这项工作),否则我建议远离它们。

于 2012-09-26T00:10:20.627 回答
3

您可能对VBFixedStringAttributeVBFixedArrayAttribute感兴趣,尽管它们只在少数地方使用。

另见这个问题这个问题

于 2012-09-25T23:42:23.647 回答