C# 从内存消耗的角度来看,这两段代码之间有什么区别

C# 从内存消耗的角度来看,这两段代码之间有什么区别,c#,memory-management,C#,Memory Management,我正在创建一些作为参数发送的对象。有人告诉我最好使用第二块代码,因为它不像我的代码块那样消耗内存。 他们之间有什么区别 object[] methodParameters = new object[] { new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_1_2_OFF_OFF } }, null, null }; //.

我正在创建一些作为参数发送的对象。有人告诉我最好使用第二块代码,因为它不像我的代码块那样消耗内存。 他们之间有什么区别

object[] methodParameters = new object[] {
    new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_1_2_OFF_OFF } },
    null,
    null
};
//...some code...
methodParameters = new object[] {
    new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_3_4_OFF_OFF } },
    null,
    null
};
object[]methodParameters=新对象[]{
新字典(){“端口”,参数[“端口”]},{“消息”,Settings.RELAY_1_2_OFF_OFF},
无效的
无效的
};
//…一些代码。。。
methodParameters=新对象[]{
新字典(){“端口”,参数[“端口”]},{“消息”,Settings.RELAY_3_4_OFF_OFF},
无效的
无效的
};
还有这个

object[] methodParameters = new object[3];
methodParameters[0] = new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_1_2_OFF_OFF } };
methodParameters[1] = null;
methodParameters[2] = null;
//...some code..
methodParameters[0] = new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_3_4_OFF_OFF } };
methodParameters[1] = null;
methodParameters[2] = null;
object[]methodParameters=新对象[3];
methodParameters[0]=new Dictionary(){{“端口”,参数[“端口”]},{“消息”,Settings.RELAY_1_2_OFF_OFF};
methodParameters[1]=null;
methodParameters[2]=null;
//…一些代码。。
methodParameters[0]=new Dictionary(){{“端口”,参数[“端口”]},{“消息”,Settings.RELAY_3_4_OFF_OFF};
methodParameters[1]=null;
methodParameters[2]=null;

在第一个代码块中,第一个实例化将占据内存中的一个位置。第二个实例化将在内存中占据不同的位置,最终第一个实例化将由垃圾收集器清理

在第二个代码块中,数组只有一个实例化,数组的元素被覆盖

在这两个块中,为索引0实例化的字典将在内存中占据一个位置,然后当实例化“新”字典时,它将在内存中占据另一个位置,最终字典的第一个实例化将由垃圾收集器清理


我想说,第一个代码块将“暂时”占用更多内存,直到垃圾收集器触发。

想象一下,第二个代码块编写为:

object[] methodParameters = new object[3];
methodParameters[0] = new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_1_2_OFF_OFF } };
methodParameters[1] = null;
methodParameters[2] = null;
//...some code..
methodParameters[1] = new Dictionary<string, string>() { { "port", parameters["port"] }, { "message", Settings.RELAY_3_4_OFF_OFF } };
methodParameters[1] = null;
methodParameters[2] = null;
object[]methodParameters=新对象[3];
methodParameters[0]=new Dictionary(){{“端口”,参数[“端口”]},{“消息”,Settings.RELAY_1_2_OFF_OFF};
methodParameters[1]=null;
methodParameters[2]=null;
//…一些代码。。
methodParameters[1]=new Dictionary(){{“端口”,参数[“端口”]},{“消息”,Settings.RELAY_3_4_OFF_OFF};
methodParameters[1]=null;
methodParameters[2]=null;
它看起来与原始版本非常相似,但是它包含了一个令人讨厌的潜在错误-我们最终得到了
methodParameters
有效地包含了与以前相同的数据
/…一些代码..
。因此,我们为了单个数组分配而交换了清晰可读的代码,完全忽略了我们仍然有相同数量的
字典
分配,并且这些字典也可能有任意数量的内部分配

正如我所说的,编写清晰、易懂的代码,然后对代码进行配置,以找出在哪里可以考虑减少内存使用的方法,并确保以不容易引入bug的方式进行。


我几乎可以保证在这里找不到它。

内存使用是程序中的实际问题吗?如果是,这是内存使用问题的位置吗?不要学习各种经验法则,然后盲目地应用它们,因为它们“更好”。或者换句话说,与其尝试学习各种“最好”的方法,不如编写清晰易懂的代码来完成正确的工作。然后分析应用程序,如果内存使用不可接受,则将精力集中在内存使用存在问题的实际领域。但是我得到一个警告,我应该使用第二行代码中的代码。在第一行代码中,创建两个数组,并将它们赋给methodParameters变量。第二段代码只创建一个数组,但在最后一部分中更改了列表的内容。在第二种变体中,很容易忽略为其中一个参数指定新值,从而意外地发送一个错误的参数,这是以前使用时留下的。这就是为什么我喜欢更清晰的代码。谢谢你澄清问题。这是我想听的。谢谢你的回答帮助我更好地理解了在这两种状态下,记忆发生了什么。谢谢你给出的所有答案!我会尽量用我写代码的方式更有条理。