我在理解C#的某些语法和内部工作方面遇到麻烦。我有一个在构造函数中设置了只读属性Bars的类。
如果我使用某种InitializeWithYield
方法来执行此操作yield returns
,则该方法不会被称为构造函数。而是在每次调用该属性时调用它。不是我所期望的。
如果我使用“普通”方法执行此操作,则它会按我的预期工作:初始化属性一次并完成。
显然,我并不完全了解的使用yield
。我的问题是:为什么InitializeWithYield
不是从构造函数中调用该方法,而是在每次调用该属性时?
class Foo
{
public Foo(int length)
{
// toggle these to see the issue
Bars = InitializeWithYield(length);
//Bars = InitializeCalledFromConstructor(length);
}
public void DoSomething()
{
IBar firstBar = Bars.FirstOrDefault(); // calls InitializeWithYield if in constructor
IList<IBar> listOfBar = Bars.ToList(); // calls InitializeWithYield if in constructor
Console.Write($"First Bar has value {b.Value}");
}
IEnumerable<IBar> Bars { get; }
// shorter syntax, but gets called every time the Bars property is used
// also, not called from constructor
IEnumerable<IBar> InitializeWithYield(int number)
{
for (int i = 0; i < number; i++)
{
yield return new Bar(i);
}
}
// this only gets called from the constructor, which is what I want
IEnumerable<IBar> InitializeCalledFromConstructor(int number)
{
IList<IBar> result = new List<IBar>();
for (int i = 0; i < number; i++)
{
result.Add(new Bar(i));
}
return result;
}
}
如代码所示,枚举器的行为与普通数组完全不同。它们的值被延迟加载或按需加载。这与一次加载所有值的普通数组不同。
因此,InitializeWithYield()
将为每个未初始化的值调用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句