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

sou*_*ola 5 c# enums if-statement

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

我有一个enum包含房间类型:

public enum RoomType
{
    Default = 0,
    Building,
    Boss,
    Item,
    Standard,
    Start,
}
Run Code Online (Sandbox Code Playgroud)

在连接方法中,我检查邻居,看看它是什么样的房间:

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);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我检查房间的类型是否是Start,它始终true是连接添加.

IMG IMG2

我不知道为什么会这样.

我在哪里设置TypeOfRoom: img3

InB*_*een 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)
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在您将看到条件if工作得很好,但neighbourhood[2,1].TypeOfRoom不等于typeOfRoom,这意味着它正在另一个线程中被修改。

如果您不知道其他线程如何或在何处修改您的对象,那么您将面临更大的问题需要解决,因为您似乎不了解您正在使用的代码或框架。

如果或当您确实了解发生这种情况的原因和时间时,您将需要实现一些同步机制或转向(首选)不可变的实现。