C# decorator序列在延迟执行中有什么用途?

C# decorator序列在延迟执行中有什么用途?,c#,.net,linq,decorator,lazy-evaluation,C#,.net,Linq,Decorator,Lazy Evaluation,我正在学习LINQ,并试图了解延迟执行是如何工作的 困扰我的一句话是:- 查询运算符通过返回装饰程序序列提供延迟执行 我试着搜索一下装饰师,我得到的信息是:- 装饰者动态地将额外的职责附加到对象上。装饰器为扩展功能提供了子类化的灵活选择 我无法将LINQ(延迟执行)的执行与装饰者的角色联系起来 因此,我只想知道decorator/decorator序列在LINQ延迟执行中的作用。我不会回答实际使用的术语,但需要理解的是,LINQ to对象是使用迭代器块有效实现的(无论这是否是实际实现都有些无关)

我正在学习LINQ,并试图了解延迟执行是如何工作的

困扰我的一句话是:-

查询运算符通过返回装饰程序序列提供延迟执行

我试着搜索一下装饰师,我得到的信息是:-

装饰者动态地将额外的职责附加到对象上。装饰器为扩展功能提供了子类化的灵活选择

我无法将LINQ(延迟执行)的执行与装饰者的角色联系起来


因此,我只想知道decorator/decorator序列在LINQ延迟执行中的作用。

我不会回答实际使用的术语,但需要理解的是,LINQ to对象是使用迭代器块有效实现的(无论这是否是实际实现都有些无关)。例如,忽略参数验证,请考虑<代码> < < /> >:

public static IEnumerable<T> Where(this IEnumerable<T> source,
                                   Func<T, bool> predicate)
{
    // TODO: Eager argument validation (not as easy as it sounds)
    foreach (var item in source)
    {
        if (predicate(item))
        {
            yield return item;
        }
    }
}
公共静态IEnumerable其中(此IEnumerable源,
Func谓词)
{
//TODO:急切的参数验证(不像听起来那么简单)
foreach(源中的var项)
{
if(谓语(项))
{
收益回报项目;
}
}
}
重要的是,当返回的序列被要求输入下一个元素时,此代码只要求原始输入源提供其数据。对你来说那是延期执行。实际上,在调用方请求调用
GetEnumerator()
然后调用
MoveNext()
之前,这些方法都不会执行

这是一个装饰器,因为返回的序列实际上最终会记住对原始序列的引用,并在执行过程中对其执行转换,而不是立即获取所有项

有关这方面的更多信息,请参阅:

  • 我的
  • 我的
  • 我的Edulinq博客系列

    • 这是的一个经典应用

      让我们“映射”到LINQ的一个延迟执行方法,如下所示:

      vat list = new List<int> {1, 2, 3, 4, 5, 6, 7};
      var res = list.Take(3);
      
      vat列表=新列表{1,2,3,4,5,6,7};
      var res=列表。取(3);
      
      • 组件
        IEnumerable
      • ConcreteComponent
        List
      • ConcreteDecorator
        是一个实现从
        Take(int)
        方法返回的
        IEnumerable
        的类。该实现引用了
        组件
        (在我们的例子中,这是
        具体组件
        ,但也可以是抽象组件)

      但是,请注意,
      ConcreteDecorator
      不是(或不总是)手动编写的。相反,通常是在实现使用
      yield return
      语句时。

      您在哪里读到的?对我来说,这似乎是一个奇怪的描述。第一个语句(关于装饰程序序列)简而言之是在
      C#5.0中,没有进一步描述“装饰程序序列”的含义?这是不寻常的——简言之,我通常认为C#5相当高。它们怎么可能是装饰设计模式的应用呢?扩展方法是在中编译的静态方法,在运行时不可更改。Decorator允许您将一个类包装到另一个类中,并(动态地)更改其行为——这是静态扩展方法无法做到的。@snr LINQ方法是静态的这一事实是偶然的。从它们返回的对象是包装器——我说的是从静态LINQ方法返回的
      IEnumerable
      的实现:它们包装传递到方法中的
      IEnumerable
      对象,并改变它们的行为。它们怎么可能是装饰设计模式的应用程序?扩展方法是在中编译的静态方法,在运行时不可更改。Decorator允许您将一个类包装到另一个类中,并(动态地)更改其行为——这是静态扩展方法无法做到的。然而,我还没有开始阅读。但是,我读过(:@snr:将其视为修饰
      IEnumerable
      。想象一个字符串的初始列表,然后是从
      Where
      返回的序列-这通过过滤掉一些元素来“修饰”序列。原始序列由过滤后的序列包装。