作为一个相当初级的开发人员,我遇到的问题突出了我缺乏经验和我所知的漏洞。如果这里的序言太长,请原谅。
我发现自己处于一个涉及我需要学习一些新的(对我而来)技术的项目,包括LINQ(对于这个项目来说是OBJECTS和XML)等等。我读到的所有内容都表明,要使用LINQ,我需要完全理解以下内容(代理,匿名方法和Lambda表达式)。
好的,所以现在很有趣。我曾经使用过.NET事件模型,因此我已经消费了代表,但是大多数细节都是隐藏的(感谢Microsoft!)。我理解,在基本层面上,委托实例是指向方法的指针(我知道这种过度简化)。
我知道匿名方法本质上是一种内联的未命名方法,通常(如果不是唯一的话)创建为委托的目标。
我也理解lambdas以不同的方式用于简化语法,并可用于将简单的匿名方法指向委托。
请原谅我,如果我的任何描述都在这里,那么这就是我理解这些主题的基本层面。
所以,挑战:
如果我对这些项目的了解甚至更接近,至少在基本层面上有人能告诉我吗?我不是在寻找复杂的深奥细节,只是基础(现在)。
在将LINQ应用于项目中以达到合理的效果之前,我需要在多大程度上真正理解这些概念?我想完全理解它,并愿意花时间。在我需要完成一些工作之前,我可能没有时间完全理解所有这些东西。
任何人都可以向我指出一些解释这些主题的好文章,并将它们应用到“真实世界”的例子中,这样我就可以了解主题的基础知识和应用它们吗?我的意思是现实世界,我是如何在“客户和发票”的背景下使用它而不是抽象的“矢量和形状”或“动物和奶牛”。出于演示目的,这种情况可能有点人为,但希望不是严格的学术性的。我在网上和书中找到了一些例子,但似乎很少有“简单英语”的解释。
提前感谢您的耐心,时间和专业知识。
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章有几个不同的委托使用示例。
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章有几个不同的委托使用示例。
我在哪里可以找到C#3的深度指南?
1)到目前为止你的知识似乎没问题。 Lambda表达式转换为匿名方法或System.Linq.Expressions.Expression,具体取决于上下文。由于您没有使用数据库技术,因此您不需要理解表达式(所有lambda都是匿名方法)。您没有列出扩展方法,但这些方法非常重要(并且易于理解)。确保您了解如何将扩展方法应用于接口 - 因为linq中的所有功能都来自System.Linq.Enumerable - 针对IEnumerable(Of T)的扩展方法的集合。
2)你不需要对lambdas有深刻的理解。
箭头语法(=>)对我来说是最大的障碍。箭头分隔lambda表达式的签名和正文。
总记得 : Linq方法在枚举之前不会执行。
注意使用 lambda中的循环变量。这是延迟执行的副作用,特别难以追踪。
3)当然,这里有一些我的答案显示linq方法调用 - 一些用xml。