使用LINQ to Objects是否存在风险,因为微软可能会对其进行更改?

5
我和一位同事就在我们的C#代码中使用LINQ to Objects (IEnumerable, not IQueryable)发生了争论。我正在使用LINQ,他说我们不应该在我们的代码中使用外部供应商(Microsoft)的代码,而是应该在我们自己的抽象层中包装它。
现在我理解这种方法论的用法,当你有一个可能在下周停业的无名第三方dll时,或者当你处理数据库调用时(即返回通用数据提供程序,而不是SQL或Oracle特定的提供程序),但在我看来,LINQ语法对于Microsoft来说太漂亮/优雅/易读了,他们未来10年内不太可能放弃它。这与ToString("Hello {0}", firstName);功能被删除的可能性相当。
我可以放弃争论,并实现我们自己的LINQ库,调用标准的LINQ方法,但这是否过度了呢?此外,我只能使用扩展方法,我不知道如何包装这个:
from e in employees
select new { e.Name, e.Id };

你会支持或反对使用LINQ to objects(IEnumerable扩展方法)吗?

5
按照同样的逻辑,你的同事可能应该避免使用List<T>等内容。我已经投票关闭此问题,因为它更适合讨论而不是具体答案。 - user7116
不太可能发生重大变化。你的同事似乎是那些过度抽象化的人之一。 - m4tt1mus
4
"我们不应该使用外部供应商(Microsoft)的"- 这排除了所有的.NET库... "翻译:我们不应该使用外部供应商(Microsoft)的产品,这意味着我们无法使用任何.NET库。 - H H
2
@Chris:欢迎您编辑问题,使其更具建设性。目前来看,这不是一个可回答的问题;在这里没有人有水晶球。 - Robert Harvey
2
这个同事是个白痴,而且这个问题的陈述方式仍然不适合 SO 的问答格式。 - C. A. McCann
显示剩余4条评论
5个回答

12
你的朋友是错的。LINQ是C# 3.0的旗舰特性,不会离开语言。微软有可能停止支持C#(虽然我严重怀疑),但只要有C#,就会有LINQ。此外,请考虑LINQ-to-objects扩展方法所在的程序集:System.Core

这是一个非常好的观点@dlev。如果它在名为System.Core的dll中,我认为微软无法向开发人员传递更强烈的信息,即它不会很快消失。 - Daryl

10

他完全错了。
那个论点只适用于处理可互换的组件,比如数据库平台。

Microsoft非常小心地避免在.NET中进行重大更改;他们不可能放弃LINQ。

回答您提出的其他观点,查询语法(from x in y)是一个编译器功能,它被转换为方法调用。
如果你自己编写方法,编译器会很乐意使用它们。

已经有第三方实现LINQ to Objects方法,例如LINQBridge(用于.Net 2.0,早于LINQ),或EduLINQ(为教育目的编写)。


2
一切都可能会改变。这仅适用于当事物很可能发生变化,并且处理变化的成本大于处理试图保护您免受变化影响的额外抽象层的成本时(包括设计、编写、测试和维护的成本)。 - jason

8
我之前使用了LINQ,但他说我们不应该在我们的代码中使用外部供应商(微软)的代码,而是应该在我们自己的抽象层中包装它。
这是语言的核心部分(即C#语言规范的一部分)。只要C#存在,它就会存在。对它做出改变将导致破坏性变化,并给微软的客户带来巨大的成本。他们不会这样做。

微软过去曾经彻底改变过编程语言,例如从VB6到VB.NET。是的,他们试图尽可能地保持兼容性,但是有很多破坏性的变化。大多数人(包括我自己)会说这些变化是好事情,是必要的。然而,在未来10年内不太可能发生任何变化。 - Erik Funkenbusch
3
VB.NET 是一种全新的语言,而不是 VB6 的下一个版本。 - Rodi

3

将类库依赖,如ADO.NET或第三方库进行封装:值得考虑的想法。

封装LINQ to Objects(框架的核心部分和改变游戏规则的部分):不是一个好主意。


0
也许你的同事只是觉得这样更正确:

也许你的同事只是觉得这样更正确:

var result = employees.Select(e => new { e.Name, e.Id });

无论如何,我认为你的同事的担忧是毫无根据的。
...有趣...

不,他反对使用var,因为这是“懒惰”的,而他的争论是关于使用linq扩展方法的。 - Daryl
@Daryl:一开始我觉得使用它有点奇怪...所以我能理解一开始看起来似乎违反类型安全的东西让人担忧。直到我了解了var是什么,我才想使用它,尽管看起来好像每个人都在用。他只需要克服这个问题就行了。 - IAbstract

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接