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 循环来用新的引用类型填充一个数组。
我对 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 循环来用新的引用类型填充一个数组。