作为一个相当初级的开发人员,我遇到了一个问题,突出了我缺乏经验和我的知识漏洞.如果这里的序言太长,请原谅.
我发现自己正处于一个涉及我需要学习一些新的(对我而来)技术的项目,包括LINQ(对象来说是OBJECTS和XML).我在这一点上所读到的一切都表明,要利用LINQ,我需要完全理解以下内容(代理,匿名方法和Lambda表达式).
好的,所以现在很有趣.我曾经使用过.NET事件模型,但是我已经消费了代表,但是大多数细节都被隐藏了(感谢Microsoft!).我理解在基本层面上,委托实例是指向方法的指针(我知道这是一个过度简化的过程).
据我所知,匿名方法本质上是一种内联的未命名方法,通常(如果不是唯一的话)创建为委托的目标.
我也理解lambdas以不同的方式用于简化语法,可用于将简单的匿名方法指向委托.
请原谅我,如果我的任何描述都在这里,那么这就是我理解这些主题的基本层面.
所以,挑战:
如果我对这些项目的了解甚至更接近,至少在基本水平上有人能告诉我吗?我不是在寻找复杂的深奥细节,只是基础(现在).
在项目中应用LINQ以达到合理的效果之前,我需要在多大程度上真正理解这些概念?我想完全理解它,并愿意花时间.在我需要完成一些工作之前,我可能没有时间完全理解所有这些东西.
任何人都可以向我指出一些解释这些主题的好文章,并将它们应用到"真实世界"的例子中,这样我就可以了解这些主题和应用的基础知识吗?我的意思是现实世界,我是如何在"客户和发票"的背景下使用它而不是抽象的"矢量和形状"或"动物和奶牛".出于演示目的,这种情况可能有点人为,但希望不是严格的学术性的.我在网上和书中找到了一些例子,但似乎很少有"简单英语"的解释.
提前感谢您的耐心,时间和专业知识.
我在哪里可以找到C#3的深度指南?
1)到目前为止你的知识似乎没问题.Lambda表达式将转换为匿名方法或System.Linq.Expressions.Expression,具体取决于上下文.由于您没有使用数据库技术,因此您不需要理解表达式(所有lambdas都是匿名方法).您没有列出扩展方法,但这些方法非常重要(并且易于理解).确保你看到如何将扩展方法应用于接口 - 因为linq中的所有功能都来自System.Linq.Enumerable - 一组针对IEnumerable(Of T)的扩展方法.
2)你不需要对lambdas有深刻的理解.
箭头语法(=>)对我来说是最大的障碍.箭头分隔lambda表达式的签名和正文.
永远记住: 在枚举之前不会执行Linq方法.
注意在lambda中使用循环变量.这是延迟执行的副作用,特别难以追踪.
3)当然,这里有一些我的答案显示linq方法调用 - 一些用xml.
列表拆分
简单的Xml存在搜索
Xml投影 - 形状变化
1)这些描述对我来说听起来非常准确.有时,匿名方法和lambda表达式需要创建一个新类型来放置委托的目标,因此它们可以充当闭包.
2/3)我会读到一些内容,直到你对委托,匿名方法和lambda表达式感到满意为止.我在C#2.0深度介绍了C#2.0和C#3.0中与代理相关的更改,但当然其他书籍也会详细介绍.我也有一篇文章,如果有帮助的话.
至于示例 - 委托用于许多不同的目的.它们是查看相同功能的不同方式,但它们可以感觉非常不同:
提供在启动新线程时调用的代码
对UI事件做出反应
为LINQ查询提供过滤器,选择,排序等
为异步操作完成时提供回调
如果你有任何特定的情况,你想要一个例子,那将更容易回答.
编辑:我应该指出,你现在只使用LINQ to Objects和LINQ to XML这是一个好消息,因为这意味着你还不需要理解表达式树.(它们很酷,但一次只有一步......)LINQ to XML实际上只是一个与LINQ很好地结合使用的XML API - 从我记忆中来看,你只能使用带有LINQ to XML的委托你实际上正在调用LINQ to Objects.(诚然,这是非常好的事情 - 但这意味着你可以重复使用你已经学过的东西.)
由于您已经在深度中获得了C#,因此第10章和第11章提供了一些在LINQ 中使用 lambda表达式(以及转换为lambda表达式的查询表达式)的示例.第5章有几个不同的委托使用示例.