如何阻止enum走出界限?

时间:2013-05-17 09:47:30

标签: c# c#-4.0 enums

我还在学习C#编程的绳索。我正在尝试编写一个求解Knight's Tour的应用程序,但在试图获得骑士未来的位置时会遇到一些悲伤。

对于我正在使用非常简单的结构的位置:

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块拾取。

我尝试在枚举声明中添加{get; set;},但在VS2010中抛出了一些无用的语法错误。

还有什么我可以尝试阻止我的枚举超出界限吗?

2 个答案:

答案 0 :(得分:8)

  

我以为这会被try块拾取。

不。 C#中的枚举是&#34;命名数字&#34;有效。他们该类型的一组完整值。

  

还有什么我可以尝试阻止我的枚举超出界限吗?

您可以使用Enum.IsDefined检查原始枚举中是否存在值。我个人会停止使用公共字段,而是使Position不可变 - 然后验证构造函数中的值。您还可以使用WithX等方法根据当前值返回一个新值,仅更改X。虽然你有公共领域,但你永远不会相信任何特定的价值是有效的。

答案 1 :(得分:1)

使用modulo将值保持在特定范围内可能很有用:

possible.X = (position.X + (Behaviour.X * times)) % ((int)BoardRank.H + 1);

这样我不确定枚举是否是最好的解决方案,因为我们正在使用整数。数字必须是无间隙的序列,您必须确保使用最高定义的枚举值加一个。因此,如果您在枚举中添加I,则需要更改模块。

这里有一个非常简单的程序来说明它是如何工作的:

enum Foo { A, B, C }

static void Main(string[] args)
{
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(i % ((int)Foo.C + 1));
    }
}

如您所见,我们采用i modulo C + 1,这使得C整数值实际范围最大值。这是输出:

  

0,1,2,0,1,2,0,1,2,0