给参数(new或声明新变量)在内存使用上有区别吗?
本文关键字:内存 有区别 变量 new 参数 声明 新变量 | 更新日期: 2023-09-27 18:10:13
前几天我在编程,我很好奇是否
用new
给出参数Application.Run(new Form1());
或声明新变量
Form1 form1 = new Form1();
Application.Run(form1);
在ram使用率,速度,…等方面有差异
它们彼此不同吗?
是有区别的。
我定义了这个方法来显示差异:
public string Run(string param)
{
return param + "!";
}
然后我用两种方式命名它:
(1)
var text = "Hello";
Console.WriteLine(Run(text));
(2)
Console.WriteLine(Run("Hello"));
第一个产生这个IL:
IL_0000: nop
IL_0001: ldstr "Hello"
IL_0006: stloc.0 // text
IL_0007: ldarg.0
IL_0008: ldloc.0 // text
IL_0009: call Run
IL_000E: call System.Console.WriteLine
IL_0013: nop
IL_0014: ret
第二个产生这个IL:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldstr "Hello"
IL_0007: call Run
IL_000C: call System.Console.WriteLine
IL_0011: nop
IL_0012: ret
差异为IL stloc.0
。第一个方法在调用之前为text
变量分配存储空间。第二个方法没有。
差异非常非常小。
优化后的代码如下:
(1)
IL_0000: ldstr "Hello"
IL_0005: stloc.0 // text
IL_0006: ldarg.0
IL_0007: ldloc.0 // text
IL_0008: call Run
IL_000D: call System.Console.WriteLine
IL_0012: ret
(2)
IL_0000: ldarg.0
IL_0001: ldstr "Hello"
IL_0006: call Run
IL_000B: call System.Console.WriteLine
IL_0010: ret
仍然是相同的存储变化-只是少了nop
s。
区别在于
Application.Run(new Form1());
Form1对象仅在Run
调用的范围内,并且之后立即有资格进行垃圾收集。
与
而Form1 form1 = new Form1();
Application.Run(form1);
form1
仍然在Run
之后的作用域内,直到块结束才能进行GC。这可能(可能不是在这种情况下,但对于其他对象)对运行时内存使用有很大的影响。
不,没有区别。Application.Run(…)方法可以保存对Form实例的引用。所以GC不利用这个。无论是否声明form1
变量,当方法结束执行时,对它的引用都会丢失。