C# .NET-将引用变量添加到arraylist与将新对象()添加到arraylist

C# .NET-将引用变量添加到arraylist与将新对象()添加到arraylist,c#,C#,我只是想知道,当我执行以下操作时,是否存在任何性能差异(特别是内存使用情况) 而不是做: ArrayList array = new ArrayList(); object obj = new object(); for(int x = 0; x < 100; x++) { array.Add(obj); } ArrayList数组=新的ArrayList(); object obj=新对象(); 对于(int x=0;x

我只是想知道,当我执行以下操作时,是否存在任何性能差异(特别是内存使用情况)

而不是做:

ArrayList array = new ArrayList();
object obj = new object();

for(int x = 0; x < 100; x++)
{
    array.Add(obj);
}
ArrayList数组=新的ArrayList();
object obj=新对象();
对于(int x=0;x<100;x++)
{
array.Add(obj);
}
我这样做:

ArrayList array = new ArrayList();

for(int x = 0; x < 100; x++)
{
    array.Add(new object());
}
ArrayList数组=新的ArrayList();
对于(int x=0;x<100;x++)
{
Add(新对象());
}
还是完全一样

据我所知,系统在内存中保存对obj变量的引用,一旦方法完成,变量就会被释放,内存也会被释放


因此,如果我在每个循环上调用
ArrayList.Add(new Object())
,那么没有内存分配给引用的变量?

第一个变量在数组的所有100个插槽中存储相同的对象引用

第二个版本创建100个不同的对象,并将它们(对这些对象的引用)存储在数组中

第一个:1个对象,100个引用
第二个:100个对象,100个参考


这绝对不是一回事。

在第二种方法中,在每次迭代中,您将实例化一个新对象,该对象也需要自己的内存空间。在第一种方法中,您总是引用内存中的同一对象


所以在内存分配方面有很大的不同。这是关于Java的,
add
方法以小写字母开头。当然,您应该参数化泛型类型
ArrayList

扩展到Gosu answer,使用fist方法将对象添加到数组中不会有任何实际用途,因为如果您更改数组中任何对象的值,它将更改所有100项,因为它是引用类型。
是的,Java和c都是一样的。

这是Java还是c,答案很大程度上取决于这个事实,这是一个关于对象是什么的例子,你是在做100个不同的引用还是同一个引用Java和C#之间的区别是什么?我认为你必须了解更多关于“new”关键字的知识。你的代码肯定不会在任何Java编译器下编译。
List
方法是小写的
add()
。@Sayse-Cool,谢谢你提供的信息!不是真的不,第一种方法实际上是用一个新的引用创建新对象,唯一的区别是上面提到的。你所说的“不是真的,不是”到底是什么意思?关于内存分配,它是完全相同的,这两种方法对内存有相同的影响,两者都创建新对象。第一个代码段创建一个对象,该对象被引用100次。第二个代码段创建100个对象,每个对象引用一次。这就是我在回答中所说的,也是Gosu所说的。还是我遗漏了什么?@Ahmad-换句话说,两种情况下都会创建100个新对象,但是当使用第一种方法时,所有实例都引用一个对象,其中第二种方法各有自己的实例