不从构造函数调用收益率返回的方法?

阿诺·范·博文(Arno van Boven)

我在理解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;
    }
}
live627

如代码所示,枚举器的行为与普通数组完全不同。它们的值被延迟加载或按需加载。这与一次加载所有值的普通数组不同。

因此,InitializeWithYield()将为每个未初始化的值调用它。

C#中使用的yield关键字是什么?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

IEnumerator收益率返回类型错误

来自分类Dev

使用收益率而不返回类型

来自分类Dev

IEnumerator收益率返回类型错误

来自分类Dev

使用收益率而不返回类型

来自分类Dev

执行收益率返回后的代码

来自分类Dev

更紧凑的“收益率回报”方法?

来自分类Dev

即使在调用“ .ToList()”之后,递归收益率也不会返回值

来自分类Dev

即使在调用“ .ToList()”之后,递归收益率也不会返回值

来自分类Dev

修改收益率的返回值

来自分类Dev

函数fzero,matlab,内部收益率,复数根

来自分类Dev

收益率合并排序函数中的错误

来自分类Dev

收益率无效,但收益率有效

来自分类Dev

ES6收益率(收益率1)(收益率2)(收益率3)()

来自分类Dev

收益率IEnumerable <IEnumerable <... >>

来自分类Dev

收益率-内存优化

来自分类Dev

Ruby Blocks(收益率)

来自分类Dev

对于收益率返回方法,是否可能有一个“最终”代码块?

来自分类Dev

在此示例中,为什么“收益率”和“收益率收益率”具有相同的行为?

来自分类Dev

在此示例中,为什么“收益率”和“收益率收益率”具有相同的行为?

来自分类Dev

Scala的未来内部收益率

来自分类Dev

PHP收益率,奇怪的行为

来自分类Dev

收益率可重入吗?

来自分类Dev

OpenCV 3.1 ANN预测收益率

来自分类Dev

瓦拉收益率未恢复

来自分类Dev

收益率怪异行为

来自分类Dev

将列表与收益率连接

来自分类Dev

R中的收益率曲线排序

来自分类Dev

延迟评估收益率值

来自分类Dev

熊猫年化收益率