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

Mic*_*ael 8 c# reference-type

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

如果我有课:

class A
{
//code
}
Run Code Online (Sandbox Code Playgroud)

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

A [] arr = new A[50];
Run Code Online (Sandbox Code Playgroud)

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

arr = Enumerable.Repeat(new A(), 50);
Run Code Online (Sandbox Code Playgroud)

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

bool theSameHashCode = questions[0].GetHashCode() == questions[1].GetHashCode();
Run Code Online (Sandbox Code Playgroud)

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

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

Kap*_*pol 15

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

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

只有一个对象.

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

Enumerable.Range(1, 50).Select(i => new A()).ToArray();
Run Code Online (Sandbox Code Playgroud)

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

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

  • 来自 MSDN:“生成一个包含一个重复值的序列。” - 也许您正在使用值类型。在这种情况下,您每次都会得到一份副本。 (2认同)

Eni*_*ity 5

只是为了帮助 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;
}
Run Code Online (Sandbox Code Playgroud)

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