我一直在负责一些旧代码转换到新系统,我们已经得到了在这里一些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
相对于固定长度字符串,让人惊讶。 这是不会发生的,因为没有等价结构。 除非乔恩斯基特或安德斯·海尔斯伯格认识不同,可以被调用来权衡 - 我不认为即使他们知道的方式辩论,因为没有一个,我很肯定。
在另一方面,固定长度的字符串是绝对的魔鬼。 这就是为什么他们不包括他们在.NET。 :-)
如果你问我, 我会怎么以上MapRec对象转换为C#中可用的东西,那么你那种有一个结构和类之间的选择。 就个人而言,我不喜欢结构。 如果您使用的类,那么你可以通过你的getter和setter方法的方式实现一种bastardized固定字符串。 由于在这个例子中看到的,这是我将如何实现你的类型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可以做的工作),我建议住的挫折感离开他们。
你可能有兴趣在VBFixedStringAttribute和VBFixedArrayAttribute ,虽然它们在一些地方只是利用。
又见这个问题,并且这个问题 。