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
类的实例。