当前位置:  开发笔记 > 编程语言 > 正文

Linq如何工作(在幕后)?

如何解决《Linq如何工作(在幕后)?》经验,为你挑选了1个好方法。

我正在考虑为Lua制作Linq这样的东西,我对Linq的工作方式有一个大概的了解,但是想知道是否有一篇好文章或是否有人可以解释C#如何使Linq成为可能

注意:我的意思是在幕后,比如它如何生成代码绑定以及所有这些,而不是最终用户语法.



1> Jon Skeet..:

回答这个问题很难,因为LINQ有很多不同的东西.例如,坚持使用C#,涉及以下内容:

查询表达式被"预处理"为"没有查询表达式的C#",然后正常编译.规范的查询表达式部分非常简短 - 它基本上是一个机械翻译,除了"order by被翻译成OrderBy/ThenBy/etc"之外,它不会假设查询的真正含义.

委托用于表示具有特定签名的任意操作,作为可执行代码.

表达式树用于表示相同的事物,但作为数据(可以检查并转换为不同的形式,例如SQL)

Lambda表达式用于将源代码转换为委托或表达式树.

大多数LINQ提供程序使用扩展方法将静态方法调用链接在一起.这允许简单的接口(例如IEnumerable)有效地获得更多的功率.

匿名类型用于投影 - 您有一些不同的数据集合,并且您需要该数据的每个方面的位,匿名类型允许您将它们收集在一起.

隐式类型的局部变量(var)主要用于处理匿名类型时,用于维护静态类型语言,您可能无法明确地"说出"该类型的名称.

迭代器块通常用于实现进程内查询,例如LINQ to Objects.

类型推断用于使整个事情更顺畅 - 在LINQ中有很多泛型方法,没有类型推断它会非常痛苦.

代码生成用于将模型(例如DBML)转换为代码

部分类型用于为生成的代码提供可扩展性

属性用于向LINQ提供程序提供元数据

显然,很多这些不仅仅被LINQ使用,但不同的LINQ技术将依赖于它们.

如果您可以更多地指出您感兴趣的方面,我们可能会提供更多详细信息.

如果你对有效实现LINQ to Objects感兴趣,你可能会对我几周前在DDD中给出的一个演讲感兴趣 - 基本上在一小时内尽可能多地实现LINQ to Objects.我们还远远没有完成它的结束,但它应该给一个不错的主意样的,你需要做的事情(和缓冲/流,迭代器模块,查询表达式转换等).视频还没有播放(我还没有下载代码)但如果你有兴趣,请发邮件至skeet@pobox.com,我会告诉你他们什么时候起来.(我也可能会在博客上发表这篇文章.)

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有