关于固定长度的字符串,哎呀。这不会发生,因为没有等效的构造。除非 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 可以完成这项工作),否则我建议远离它们。