在循环内部和外部创建对象之间的内存差异是什么

tjh*_*in1 1 c# memory-efficient

我想在我的知识中找出一些空白.从这开始.

示例(c#):

List<Person> names = new List<Person>();

Person friend = null;
for(int i = 0; i < 5; i++)
{
    friend = new Person();
    Person guy = new Person();

    guy.name = "Bob" + i;
    friend.name = "Bill" + i;

    names.Add(guy);
    names.Add(friend);
}
Run Code Online (Sandbox Code Playgroud)

这里我在同一个循环中使用了两个Person对象,只是为了节省空间.

我的理解是,每次我实例化朋友时,我都会在内存中重用相同的位置,覆盖现有的Person对象(如果存在).

而每个新的"guy"对象都被分配了一个新的内存位置.

如果这是正确的,请纠正我,如果这是错误的,这意味着使用"朋友"而不是"家伙"更有效.

会不会出现"家伙"更好的情况?它可能取决于构造函数的实现吗?

Jon*_*eet 9

我的理解是,每次我实例化朋友时,我都会在内存中重用相同的位置,覆盖现有的Person对象(如果存在).

不,事实并非如此.您正在覆盖变量中的先前值- 但这不是对象.这只是对象的引用.还有另一个对列表中对象的引用.对象本身根本不会被覆盖.您创建的每个对象都独立于其他对象.

根据在循环内或循环外声明变量之间的区别,它没有太大区别.有一些差异:

  • 如果它在循环外声明,你可以在循环中使用该变量,然后为其赋值,这样你就可以看到之前的值
  • 如果它在循环外声明,您也可以在循环后使用该变量,以读取最后指定的值
  • 如果它在循环外声明,并且在循环使用匿名函数,则每个匿名函数将捕获相同的变量.如果它在循环内,每个匿名函数将捕获一个不同的变量.如果所有这些对你来说听起来像是gobbledygook,你可能会忽略它
  • 如果它在循环内声明,那么在一个单独的块中,你可以声明一个具有相同名称的单独变量; 如果它在循环之外声明,你不能这样做.

我通常建议在最初需要的地方声明具有最小范围的变量 - 我发现最终会有更清晰的代码.