首页 > 解决方案 > 以下情况有什么区别?

问题描述

代码在 C# 中

情况1

var p = new Person();
p = getPerson(p); 

案例2

var p = new Person();
getPerson(p);

在上述情况下,任何情况下都会消耗额外的内存吗?

标签: c#memorymapping

解决方案


假设getPerson只修改了 的属性,Person并且有 2 种不同的方法,一种返回一个人,另一种是无效的,这段代码没有明显的区别

static void Main(string[] args)
{

   // example 1
   var p = new Person();
   p = getPerson1(p);

   // example 2
   var p2 = new Person();
   getPerson2(p2);
}

示例 1

IL_0001: newobj       instance void ConsoleApp8.Person::.ctor()
IL_0006: stloc.0      // p

// [33 10 - 33 28]
IL_0007: ldloc.0      // p
IL_0008: call         class ConsoleApp8.Person ConsoleApp8.Program::getPerson1(class ConsoleApp8.Person)
IL_000d: stloc.0      // p

示例 2

IL_000e: newobj       instance void ConsoleApp8.Person::.ctor()
IL_0013: stloc.1      // p2

// [36 4 - 36 19]
IL_0014: ldloc.1      // p2
IL_0015: call         void ConsoleApp8.Program::getPerson2(class ConsoleApp8.Person)
IL_001a: nop          

OpCodes.Stloc 字段

从计算堆栈顶部弹出当前值并将其存储在指定索引处的局部变量列表中。

OpCodes.Nop 字段

如果修补了操作码,则填充空间。尽管可以消耗一个处理周期,但没有执行任何有意义的操作。


简而言之,担心其他事情


推荐阅读