C#Func<&燃气轮机;图书馆代表

C#Func<&燃气轮机;图书馆代表,c#,.net,delegates,compatibility,C#,.net,Delegates,Compatibility,NET更高版本的通用Func和Action委托非常吸引人,许多地方已经证明,这些委托可以在针对.NET 2.0的代码中轻松地重新创建,例如 然而,从以.NET 2.0为目标的库的角度来看,针对任何更高版本的.NET构建的应用程序都可能会使用.NET 2.0,这是如何叠加的呢。在库中实现这个“兼容性层”绝对是一种冲突(无论是在私有接口还是公共接口方面),还是有办法使这项工作独立于消费应用程序构建所依据的目标框架 如果这是一个非初学者,是否最好: A) 用不同的名称定义一组相同的参数化委托?或 B)

NET更高版本的通用Func和Action委托非常吸引人,许多地方已经证明,这些委托可以在针对.NET 2.0的代码中轻松地重新创建,例如

然而,从以.NET 2.0为目标的库的角度来看,针对任何更高版本的.NET构建的应用程序都可能会使用.NET 2.0,这是如何叠加的呢。在库中实现这个“兼容性层”绝对是一种冲突(无论是在私有接口还是公共接口方面),还是有办法使这项工作独立于消费应用程序构建所依据的目标框架

如果这是一个非初学者,是否最好: A) 用不同的名称定义一组相同的参数化委托?或
B) 严格遵守.NET 2.0约定,并根据需要定义新的委托类型?

显而易见的事实是
Func
Action
是一个好主意。它们使代码更易于阅读,并且避免了大量杂乱的样板委托声明这就是为什么要使用它们

因此,您需要使用这种非常吸引人的编程风格,它是一种标准技术,现在几乎普遍使用,而不是旧的方式,但是您不能使用它,因为您的目标是框架的遗留版本。你该怎么办

你有三个选择:

  • 使用该功能之前常用的编程样式
  • 将该特性添加到您自己的代码中,但名称不冲突
  • 使用“真实”名称将功能添加到您自己的代码中,但要在您自己的命名空间中
  • 使用旧的编程风格放弃了我们从该特性中获得的所有好处。这是一个巨大的牺牲。但也许你所有的合作开发者都习惯了这种编程风格

    使用名称不冲突的功能似乎足够明智。人们将能够阅读代码并从这些功能中获益,但没有人会感到困惑,他们似乎不是。当您最终准备升级时,您必须修补名称。幸运的是,Ctrl+R,Ctrl+R使这项工作变得非常简单

    使用与标准功能同名的功能意味着您的代码可以针对较旧的版本,但似乎使用了较新的功能。似乎是一场胜利。但这可能会造成混乱,您必须小心您的类型不会暴露于其他未知程序集,这可能会导致源代码级编译问题。所以你必须小心,对发生的事情非常清楚。但它可以有效地工作


    你必须根据自己的需要,选择适合自己情况的方法。对于每个人来说,没有一个正确的答案,只有取舍。

    如果您正在构建一个针对.NET 2.0的库,请尽可能使用框架中现有的委托。否则,请创建自己的代理,但在任何情况下都不要命名它们或创建“通用”代理,以镜像在.NET 3.0及更高版本中找到的代理。这只会导致混乱。兼容层是不必要的,因为兼容的代理可以相互转换。由于没有其他答案告诉我,我将假设这个问题没有聪明的解决方案。尽管这些权衡已经在我脑海中浮现,但这是一个合理的答案。