使用(新变量或声明新变量)给出参数在 ram 用法上有区别吗?

Does giving arguments with (new or declaring new variable) has difference in ram usage?

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

用新的

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

或声明新变量

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

在内存使用、速度等方面存在差异

它们有什么不同吗?

不,没有区别。 Application.Run(..) 方法可以保存对 Form 实例的引用。所以 GC 不使用它。当方法结束执行时,是否声明 form1 变量并不重要,因为对它的引用会丢失。

是的,有区别。

我定义了这个方法来显示区别:

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  

存储方面的变化仍然相同 - 只是少了 nops。

不同的是在

的情况下
Application.Run(new Form1());

Form1 对象仅在 Run 调用的范围内,并且有资格在之后立即进行垃圾回收。

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

form1 仍在 Run 之后的范围内,并且在块结束之前无法进行 GC。 这可以(可能不是在这种情况下,但对于其他对象)对运行时内存使用有相当大的影响。