Enumerable.Repeat用于引用类型对象的初始化

我有一个关于Enumerable.Repeat函数的问题。

如果我有课:

class A { //code } 

我将创建一个该类型对象的数组:

 A [] arr = new A[50]; 

接下来,我将要初始化这些对象,调用Enumerable.Repeat:

 arr = Enumerable.Repeat(new A(), 50); 

这些对象在内存中是否具有相同的地址? 如果我想检查他们的哈希码,例如以这种方式:

 bool theSameHashCode = questions[0].GetHashCode() == questions[1].GetHashCode(); 

这将返回true,如果我将更改一个对象属性,则所有其他对象也将更改它。

所以我的问题是:是否正确地初始化引用类型对象? 如果没有,那么更好的方法是什么?

使用Enumerable.Repeat这种方式只会初始化一个对象,并在每次迭代结果时返回该对象。

这些对象在内存中是否具有相同的地址?

只有一个对象。

要实现您的目标,您可以这样做:

 Enumerable.Range(1, 50).Select(i => new A()).ToArray(); 

这将返回50个不同类型A对象的数组。

顺便说一句, GetHashCode()返回相同值的事实并不意味着对象在引用上是相等的(或者就此而言简单相等)。 两个不相等的对象可以具有相同的哈希码。

为了帮助澄清Camilo,这里有一些测试代码显示了手头的问题:

 void Main() { var foos = Enumerable.Repeat(new Foo(), 2).ToArray(); foos[0].Name = "Jack"; foos[1].Name = "Jill"; Console.WriteLine(foos[0].Name); } public class Foo { public string Name; } 

这打印“吉尔”。 因此,它表明Enumerable.Repeat只创建一个Foo类的实例。