C# 为什么字典数组需要第二次初始化 公共部分类表单1:表单 { 字典[]db_players=新字典[6]; 公共表格1() { db_players[0]=新字典(); db_玩家[0]。添加(“qwerty”,7); 初始化组件(); } 私有void Form1\u加载(对象发送方、事件参数e) { Show(db_players[0][“qwerty”].ToString()); } }

C# 为什么字典数组需要第二次初始化 公共部分类表单1:表单 { 字典[]db_players=新字典[6]; 公共表格1() { db_players[0]=新字典(); db_玩家[0]。添加(“qwerty”,7); 初始化组件(); } 私有void Form1\u加载(对象发送方、事件参数e) { Show(db_players[0][“qwerty”].ToString()); } },c#,dictionary,C#,Dictionary,db\u players[0]。如果不在构造函数中初始化Add(),它将无法工作。我不明白为什么,因为我在上面做过。为什么呢?很抱歉提出这个愚蠢的问题。您正在声明一个包含6个词典的数组。每个数组元素都需要单独实例化 执行您现在执行的操作,或内联初始化它们: public partial class Form1 : Form { Dictionary<string, int>[] db_players = new Dictionary<string, int>[6]

db\u players[0]。如果不在构造函数中初始化Add(),它将无法工作。我不明白为什么,因为我在上面做过。为什么呢?很抱歉提出这个愚蠢的问题。

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

执行您现在执行的操作,或内联初始化它们:

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());
    }
}
Dictionary[]db\u players=新字典[6]{
新字典(),
新字典(),
新字典(),
新字典(),
新字典(),
新字典()
};

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

执行您现在执行的操作,或内联初始化它们:

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());
    }
}
Dictionary[]db\u players=新字典[6]{
新字典(),
新字典(),
新字典(),
新字典(),
新字典(),
新字典()
};

您不是在这里创建词典。。创建字典的数组。在C#中,无论何时初始化数组,都不是在初始化其元素

有关更多信息,您可以找到此

在这个链接中有一个注释

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


对于引用类型,这是null。因此,为什么您的代码不起作用

您没有在这里创建字典。。创建字典的数组。在C#中,无论何时初始化数组,都不是在初始化其元素

有关更多信息,您可以找到此

在这个链接中有一个注释

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

对于引用类型,这是null。因此,为什么您的代码在这一行中不起作用

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>()
};
如果需要在一条语句中初始化,可以使用数组初始值设定项语法

for (int i=0; i<db_players.Length; i++)
{
    db_players[i] = new Dictionary<string, int>(); 
}
Dictionary[]db\u players=newdictionary[]
{
新字典(),
新字典(),
新字典(),
新字典(),
新字典(),
新字典()
};
这一行

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>()
};
如果需要在一条语句中初始化,可以使用数组初始值设定项语法

for (int i=0; i<db_players.Length; i++)
{
    db_players[i] = new Dictionary<string, int>(); 
}
Dictionary[]db\u players=newdictionary[]
{
新字典(),
新字典(),
新字典(),
新字典(),
新字典(),
新字典()
};

这一行
字典[]db_players=新字典[6]声明并初始化名为db_players的字典数组列表。它并没有赋予db_玩家它的价值。因此,您需要
db_players[0]=newdictionary()
为数组本身中的每个对象分配一个字典。

此行
dictionary[]db_players=new dictionary[6]声明并初始化名为db_players的字典数组列表。它并没有赋予db_玩家它的价值。因此,您需要
db_players[0]=newdictionary()
为数组中的每个对象分配一个字典。

我不确定我是否理解这个问题。你是说这里显示的代码可以工作,但是如果你删除了行
db_players[0]=new…,它就不能工作了?你想知道为什么你需要那一行代码吗?可以肯定的是,一些细节问题:1。当你说“在构造函数中初始化它”时,你指的是什么?2.你所说的“不起作用”是什么意思?你会犯什么错误?编译错误?运行时异常?哪个?谢谢。下面的人澄清了它-1,因为他们提出了一个不清楚的问题,显然不关心提高其他人/未来读者的阅读质量。问题解决了,你可以看到4个相同的答案,我想我的意思变得很明显。无论如何,很抱歉。我不确定我是否理解这个问题。你是说这里显示的代码可以工作,但是如果你删除了行
db_players[0]=new…,它就不能工作了?你想知道为什么你需要那一行代码吗?可以肯定的是,一些细节问题:1。当你说“在构造函数中初始化它”时,你指的是什么?2.你所说的“不起作用”是什么意思?你会犯什么错误?编译错误?运行时异常?哪个?谢谢。下面的人澄清了它-1,因为他们提出了一个不清楚的问题,显然不关心提高其他人/未来读者的阅读质量。问题解决了,你可以看到4个相同的答案,我想我的意思变得很明显。不管怎样,很抱歉。一个
int
数组怎么样?太棒了!我想这就是OP困惑的原因。数组初始化在值类型和引用类型之间有所不同。那么
int
数组呢?太棒了!我想这就是OP困惑的原因。数组初始化在值类型和引用类型之间有所不同。