我的任务是将一些遗留代码转换为新系统,我们在这里有一些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
答案 0 :(得分:3)
您可能对VBFixedStringAttribute和VBFixedArrayAttribute感兴趣,但它们仅在少数地方使用。
答案 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可以完成这项工作),否则我建议远离它们。