【问题标题】:Unable to Store Dictionary Value in Object无法在对象中存储字典值
【发布时间】:2012-02-15 22:36:28
【问题描述】:

所以我在玩文字冒险的原型。我在每个Room 对象中创建了一个Dictionary 的availableExits,然后为原型创建了一个Room 对象数组。 Room(房间 001)在表单中正确加载,但我无法访问可用出口的列表。经过一些调试后,我发现出口没有分配给Room 对象。有人知道我在这里做错了什么吗?

代码总结:

public RoomManager()
{
    //available exits for each room
    Dictionary<string, int> room1Exits = new Dictionary<string, int>();
    room1Exits.Add("E", 002);
    room1Exits.Add("S", 003);
    Dictionary<string, int> room2Exits = new Dictionary<string, int>();
    room2Exits.Add("S", 004);
    room2Exits.Add("W", 001);
    Dictionary<string, int> room3Exits = new Dictionary<string, int>();
    room3Exits.Add("N", 001);
    room3Exits.Add("E", 004);
    Dictionary<string, int> room4Exits = new Dictionary<string, int>();
    room4Exits.Add("N", 002);
    room4Exits.Add("W", 003);

    listOfRooms = new Room[5];
    listOfRooms[0] = new Room(0, "How the hell did you get here!?!", room1Exits);
    listOfRooms[1] = new Room(001, room1Desc, room1Exits);
    listOfRooms[2] = new Room(002, room2Desc, room2Exits);
    listOfRooms[3] = new Room(003, room3Desc, room3Exits);
    listOfRooms[4] = new Room(004, room4Desc, room4Exits);
}  

...

public class Room
{
    //Init Variables
    int roomNumber;
    string roomDescription;
    //Dictionary - index N,E,S,W will use room# for available exits and 000 for no exit
    Dictionary<string, int> availableExits = new Dictionary<string, int>();

    //Constructor
    //Need a Roomnumber, Room Description, and avilable exits
    public Room(int roomIndex, string basicRoomDescript,
                Dictionary<string, int> availableExits)
    {
        roomNumber = roomIndex;
        roomDescription = basicRoomDescript;
    }

    //Properties

    //Returns which exits can be chosen
    public Dictionary<string, int> AvailableExits
    {
        get { return availableExits; }
        set { AvailableExits = availableExits; }
    }
}   

...

public partial class Form1 : Form
{
    RoomManager level;
    Player player;
    //string CurrentRoom;
    Room CurrentRoom;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, System.EventArgs e)
    {
        level = new RoomManager();
        player = new Player("Victor", 001);
        CurrentRoom = level.RoomList[player.PlayerLocation];
        lblRoom.Text = "Room#: " + player.PlayerLocation;
        txtDesc.Text = CurrentRoom.GetRoomDescription();

        //Check for available exits and enable/disable buttons as needed
        this.SetExits();
    }

    //Private Methods

    private void SetExits() //might need to feed player and current room objects
    {
        if (!CurrentRoom.AvailableExits.ContainsKey("N"))
        { btnNorth.Enabled = false; }
        if (!CurrentRoom.AvailableExits.ContainsKey("E"))
        { btnEast.Enabled = false; }
        if (!CurrentRoom.AvailableExits.ContainsKey("S"))
        { btnSouth.Enabled = false; }
        if (!CurrentRoom.AvailableExits.ContainsKey("W"))
        { btnWest.Enabled = false; }
    }
}

我已经发布了项目here。代码真的很粗糙,我今天早上刚刚破解它,还没有进行任何审查或清理。感谢您提供任何和所有帮助/建议。

【问题讨论】:

    标签: c# object dictionary


    【解决方案1】:

    你需要在 Room 构造函数中设置availableExits

    public Room(int roomIndex, string basicRoomDescript, Dictionary<string, int> availableExits)
    {
        roomNumber = roomIndex;
        roomDescription = basicRoomDescript;
        this.availableExits = availableExits;
    
    }
    

    【讨论】:

      【解决方案2】:

      您在 Room 类中有一个名为 availableExits 的局部变量,并且您将一个名为 availableExits 的参数传递给构造函数,但您从未将局部变量分配给传递给构造函数的参数。

      因此,局部变量的值始终是空字典,因为您确实将局部变量分配为新字典。

      您对AvailableExits 属性上的setter 的定义似乎是递归的,会导致StackOverflowException

      应该是这样的:

      public Dictionary<string, int> AvailableExits
      {
          get { return availableExits; }
          set { availableExits = value; }
      }
      

      最好使用自动实现的属性来代替像这样的简单属性。

      【讨论】:

      • 啊!我知道这很简单。我已经更改了构造函数来测试某些东西,但没有改回来。
      【解决方案3】:

      您没有在构造函数中分配成员变量。

      【讨论】:

        【解决方案4】:

        问题是您将 availableExits 字典传递给房间构造函数,但您没有对传入的数据做任何事情。您要么需要将传入的字典内容复制到类成员 availableExits ,或者您需要将传递给构造函数的映射视为已更改所有权,而不是在类中分配映射,而是在构造函数中分配给 this.availaleExits。

        【讨论】:

          猜你喜欢
          • 2018-08-23
          • 1970-01-01
          • 2020-11-02
          • 2011-04-14
          • 2014-08-11
          • 1970-01-01
          • 1970-01-01
          • 2016-07-30
          • 1970-01-01
          相关资源
          最近更新 更多