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