重载与泛型参数

dev*_*ium 8 .net c# vb.net generics overloading

我有个问题.在框架中,这主要是在泛型出现之前编写的,你经常会看到一个具有大量重载的函数来执行不同类型的操作.

一个)

Parse(int data)
Parse(long data)
Parse(string data)
..etc
Run Code Online (Sandbox Code Playgroud)

这似乎没问题,因为它有助于为每种方法保持较小的代码等等.另一方面,现在使用泛型,您可以执行以下操作:

b)

Parse<T>(T data)
Run Code Online (Sandbox Code Playgroud)

然后使用typeof()创建某种ifs/switch语句,以尝试推断出类型是什么以及如何处理它们.

什么是最佳做法?或者什么是帮助我在a)和b)之间做出选择的想法?

Ste*_*ger 22

恕我直言,如果你需要if/switch语句,你应该更好地重载.如果实现不依赖于具体类型仍然可以重用它,那么应该使用泛型.

所以作为一般规则:

  • 如果每种类型都有单独的实现,则重载
  • 如果您可以使用适用于所有可能类型的单个实现,请使用泛型.

  • @John - 你可以同时拥有`Parse(int data)`(以及其他特定类型)和`Parse <T>(T data)`.如果传入其中一个特定的重载类型,则将使用非泛型方法,否则将通过泛型方法推断类型参数. (3认同)

Rob*_*ino 7

代码嗅觉.

如果你有" 某种if/switch ",那就是一种只会尖叫多态的代码味道.它表明泛型不是解决这个问题的方法.当代码不依赖于您传递给它的具体类型时,应该使用泛型.

观看此Google Tech会谈视频:" 清洁代码会谈 - 继承,多态,和测试 ".它具体针对您所谈论的内容.

  • 哎呀......很少有东西比程序员试图用完整的膨胀类层次结构完全替换普通和简单的if语句的代码更难阅读. (3认同)