我仍在学习 C# 编程的技巧。我正在尝试编写一个应用程序来解决 Knight's Tour但是在尝试为骑士争取 future 可能的位置时遇到了一些悲伤。
对于职位,我使用了一个非常简单的结构:
public struct Position
{
public enum BoardRank { A = 1, B, C, D, E, F, G, H };
public BoardRank X;
public int Y;
}
在骑士类中,我的PossibleMoves()
方法是这样开始的:
public List<Position> PossibleMoves(Position position)
{
List<Position> positions = new List<Position>();
int[] multiply = new int[]{1, -1};
foreach (int times in multiply)
{
try{
Position possible = new Position();
possible.X = position.X + (Behaviour.X * times);
possible.Y = position.Y + (Behaviour.Y * times);
positions.Add(possible);
}
...
对于 position = A1 和 times = -1,您可以看到 Behaviour.X 如何快速超出范围,但我假设这会被 try block 拾取。
我尝试添加一个 {get; set;}
在枚举声明上,但在 VS2010 中引发了一些无用的语法错误。
还有什么我可以在这里尝试阻止我的枚举越界吗?
I assumed this would have been picked up by the try block.
没有。 C# 中的枚举实际上是“命名数字”。它们不是该类型的一组完整值。
Is there anything else I can try here to stop my enum from going out of bounds?
您可以使用 Enum.IsDefined
检查原始枚举中是否存在值。我个人会停止使用公共(public)字段,而是让 Position
不可变——然后在构造函数中验证值。您还可以使用诸如 WithX
之类的方法,它根据当前值返回一个新值,仅更改 X
。虽然您拥有公共(public)字段,但您永远无法相信任何特定值都是有效的。
我是一名优秀的程序员,十分优秀!