我有一个关于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()返回相同值的事实并不意味着对象在引用上是相等的(或者就此而言简单地相等).两个不相等的对象可以具有相同的哈希码.
只是为了帮助 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类的一个实例。