如果声明总是与枚举相对应

时间:2016-04-07 14:09:52

标签: c# if-statement enums

我遇到了问题。我正在制作一个实用程序来制作程序生成的地图。 我有一个房间游泳池,每个房间都摆放在一张房间的桌子上。我有一种方法将所有房间连接在一起,走在桌子上并连接相邻的房间。

我有enum,其中包含房间类型:

public enum RoomType
{
    Default = 0,
    Building,
    Boss,
    Item,
    Standard,
    Start,
}

在连接方法中,我检查邻域以查看它是什么类型的房间:

if (neighbourhood[2, 1] != null)
{
    if (firstLevel.isOn)
    {                     
        if (neighbourhood[2,1].TypeOfRoom == RoomType.Start)
        {
            roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT)
        }
    }
    else if (neighbourhood[2,1].TypeOfRoom != RoomType.Boss)
        roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT);
}

但是当我检查房间的类型是否为Start时,它始终是true并且会添加连接。

img img2

我不知道为什么会这样。

我在哪里设置TypeOfRoom: img3

2 个答案:

答案 0 :(得分:4)

问题很可能是由于竞争条件造成的。您可以按如下方式轻松检查是否是这种情况:

if (neighbourhood[2, 1] != null)
{
    if (firstLevel.isOn)
    {
        var typeOfRoom = neighbourhood[2,1].TypeOfRoom; //store type in a local variable

        if (typeOfRoom == RoomType.Start) //check against local copy
        {
             roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT)
        }
    }
    ...
}

现在您将看到if条件完全正常,但neighbourhood[2,1].TypeOfRoom不等于typeOfRoom,这意味着它正在另一个线程中进行修改。

如果你不知道你的对象被其他线程修改的方式或位置,那么你就有更大的问题要解决,因为你似乎不理解你正在使用的代码或框架。

如果了解为什么以及何时发生这种情况,您将需要实现一些同步机制或引导(优先)向不可变的实现。

答案 1 :(得分:3)

您在屏幕截图中显示的内容以及您所描述的内容听起来不可能。当发生这种情况时,通常是因为应用程序是多线程的。这在一个线程上是不可能的。但是当它正在执行另一个线程时正在修改值。

同时,您可能还会无意中将对同一对象的引用传递给多个函数。

但绝对要检查涉及线程,任务或并行函数调用的任何内容。或者,如果这是在Web环境中运行,请查看是否有多个请求可以访问共享数据。