【发布时间】:2011-03-28 14:32:25
【问题描述】:
由于各种原因,我经常发现编写与 .NET framework 2.0 或 3.5 兼容或与 .NET Compact Framework 兼容的代码是可取的,但新的 .NET 中有许多“小”功能是一个问题旧框架或 Compact Framework 中不可用的框架。
例如,我发现扩展方法非常有用,但编译器为此依赖于System.Runtime.CompilerServices.ExtensionAttribute。您可以轻松地自己定义此属性,然后在 .NET Framework 2.0(在 C# 3.0+ 下)中使用扩展方法。同样,手动定义像Tuple<T1,T2> 和Lazy<T> 这样的小.NET 4 类型也不是太难。顺便说一句,如果你想在.NET 2.0中使用LINQ,你可以使用LinqBridge。
现在假设您将ExtensionAttribute 公开,以便您编写的其他程序集可以使用它。起初这很好,但如果您想使用也有相同想法的第 3 方库怎么办?您添加了对该库的引用,现在您遇到了名称冲突。哎呀。
我还注意到,一些新库仅适用于 .NET 4.0 或 3.5,尽管它们对它的依赖很小,可以使用兼容包或 LinqBridge 解决。
如果有旧 .NET 版本的“兼容包”在一个小 DLL 中定义这些小功能,您可以证明将其包含在任何规模的项目中,那肯定会很好。有这种事吗?
更新:从沉默来看,我想没有这样的事情。如果有兴趣,我可能会自己制作这样一个 OSS 库。所以我的新问题是,如果您正在为 .NET 2、.NET 3.5、.NETCF 或 Silverlight 编写代码,您会错过 .NET 4(与 WCF/WPF 之类的怪物相比)的哪些更小 功能?我将开始列表...
-
ExtensionAttribute(不在 .NET 2 中) -
Func<...>和Action<...>代表(不在 .NET 2 中) - LINQ-to-objects(不在 .NET 2 中)
-
Tuple<...>(不在 .NET 3.5 中) -
Lazy<T>和Lazy<T,TMetadata>(不在 .NET 3.5 中) - 表达式树(不在 .NET 2 中;在 .NET 3.5 中不完整)
- 泛型变量(存在于 .NET 2 中,但无法从 C# 3 和 VB 9 访问)
-
Reflection.Emit(.NETCF 中缺少;不是一个真正的小功能,但我非常想念它)
【问题讨论】:
标签: .net .net-3.5 compact-framework .net-2.0 compatibility