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

Enumerable.Repeat for reference type objects initialization

我对 Enumerable.Repeat 函数有疑问。

如果我有一个class:

class A
{
//code
}

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

A [] arr = new A[50];

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

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

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

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

这 return 我是真的,如果我改变一个对象的属性,所有其他对象也会改变它。

所以我的问题是:这是初始化引用类型对象的正确方法吗?如果不行,那有什么更好的办法吗?

以这种方式使用 Enumerable.Repeat 将仅初始化一个对象,并且每次迭代结果时 return 该对象。

Will those objects have the same address in memory?

只有一个对象。

要实现你想要的,你可以这样做:

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

这将 return 一个包含 50 个类型为 A 的不同对象的数组。

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

为了帮助 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;
}

这会打印 "Jill"。因此,它表明 Enumerable.Repeat 仅创建了 Foo class.

的一个实例

使用以下代码创建数组时:

var foos = Enumerable.Repeat(new Foo(), 2).ToArray();

数组中每个位置相同的原因是因为你传递的是一个对象,而不是一个创建对象的函数,上面的代码是一样的:

var foo = new Foo();
var foos = Enumerable.Repeat(foo , 2).ToArray();

上面的原因也解释了为什么使用 Select 语句(如下面的代码)为每个条目创建一个新对象,因为您传递的是一个函数来指示每个对象的创建方式,而不是对象本身。

Enumerable.Range(1, 2).Select(i => new Foo()).ToArray();

我会使用一个简单的 for 循环来用新的引用类型填充一个数组。