给参数(new或声明新变量)在内存使用上有区别吗?

本文关键字:内存 有区别 变量 new 参数 声明 新变量 | 更新日期: 2023-09-27 18:10:13

前几天我在编程,我很好奇是否

用new

给出参数
Application.Run(new Form1());

或声明新变量

Form1 form1 = new Form1();
Application.Run(form1);

在ram使用率,速度,…等方面有差异

它们彼此不同吗?

给参数(new或声明新变量)在内存使用上有区别吗?

是有区别的。

我定义了这个方法来显示差异:

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变量,当方法结束执行时,对它的引用都会丢失。