为什么字典数组需要第二次初始化

本文关键字:第二次 初始化 字典 数组 为什么 | 更新日期: 2023-09-27 18:16:40

public partial class Form1 : Form
{
    Dictionary<string, int>[] db_players = new Dictionary<string, int>[6];      
    public Form1()
    {
        db_players[0] = new Dictionary<string, int>(); 
        db_players[0].Add("qwerty",7);
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        MessageBox.Show(db_players[0]["qwerty"].ToString());
    }
}

db_players[0]. add ()如果不在构造函数中初始化它就不能工作。我不明白为什么,因为我上面已经做过了。为什么呢?不好意思,这个问题太蠢了

为什么字典数组需要第二次初始化

您不是在创建字典。您正在创建一个字典的数组。在c#中,当你初始化一个数组时,你并没有初始化它的元素。

有关更多信息,您可以在MSDN

上找到这个数组教程

在这个链接中有一个注释,说明

如果在声明时未初始化数组,则数组成员将自动初始化为数组类型

的默认初始值。

对于引用类型,该值为空。这就是为什么你的代码不能工作

您正在声明一个包含6个字典的数组。每个数组元素都需要单独实例化。

要么做你现在做的,要么内联初始化它们:

Dictionary<string, int>[] db_players = new Dictionary<string, int>[6] {
  new Dictionary<string, int>(),
  new Dictionary<string, int>(),
  new Dictionary<string, int>(),
  new Dictionary<string, int>(),
  new Dictionary<string, int>(),
  new Dictionary<string, int>()
};

这一行

Dictionary<string, int>[] db_players = new Dictionary<string, int>[6]; 

创建一个长度为6的Dictionary<string, int>数组,但它不设置db_players[0], db_players[1],…中的内容

可以用循环初始化数组:

for (int i=0; i<db_players.Length; i++)
{
    db_players[i] = new Dictionary<string, int>(); 
}

如果你需要在一个语句中初始化,你可以使用数组初始化语法。

Dictionary<string, int>[] db_players = new Dictionary<string, int>[]
{
    new Dictionary<string, int>(),
    new Dictionary<string, int>(),
    new Dictionary<string, int>(),
    new Dictionary<string, int>(),
    new Dictionary<string, int>(),
    new Dictionary<string, int>()
};

Dictionary<string, int>[] db_players = new Dictionary<string, int>[6];声明并初始化一个名为db_players的Dictionary数组列表。它不给db_players它的值。因此,需要db_players[0] = new Dictionary<string, int>();为数组本身中的每个对象分配一个字典。