【发布时间】:2018-04-02 21:59:10
【问题描述】:
我创建了一个被视为地图的 20x20 多维数组。
private LinkedList<Item>[,] m_map = new LinkedList<Item>[width, height];
每个单元格都是一个Item类型的链表。武器、盔甲等物品可以放入每个单元格中。
我有以下类层次结构:
class Item
{
public string name;
}
class Weapon : Item
{
public int damage;
}
class Armor : Item
{
public int ar;
public int weight;
}
我有点惊讶,并希望接受这方面的教育。由于类型是 LinkedList
/// <summary>
/// Gets a list of weapons at the given coordinates.
/// </summary>
/// <param name="x">The map's horizontal position.</param>
/// <param name="y">The map's vertical position.</param>
/// <returns>Returns a list of weapons at the given coordinates.</returns>
public List<Weapon> GetWeapons(int x, int y)
{
List<Weapon> weapons = new List<Weapon>();
foreach (Item item in m_map[x, y])
{
if (item is Weapon)
{
weapons.Add(item as Weapon);
}
}
return weapons;
}
Item 包含的字段比 Armor 少,所以我认为 LinkedList
当您将派生类型及其基类型存储到链接列表时,编译器是否为其派生类型腾出足够的内存?我很惊讶我可以检索 Armor 类型并仍然获得其派生数据(ar,重量)。
有人能解释一下为什么会这样吗?谢谢。
【问题讨论】:
-
它存储references,如果你熟悉像C这样的语言,它们本质上是指针。这是使多态起作用的唯一方法。所有对象引用的大小相同。
-
哦,我明白了。所以集合存储引用而不是二进制副本。
-
参考类型。对于值类型,它存储一个副本。另见:stackoverflow.com/questions/14669651/…
标签: c#