在实现部分中为单元添加use子句的优点是什么?

Pep*_*Pep 6 delphi

如果我将一个单元放在单元的实现部分的uses子句中,则在该单元中声明的标识符不可用于接口部分.

这样做有什么好处,而且无法在界面中使用被引用单元的标识符?

如果您在实现部分中添加使用过的单元而不是简单地在接口部分进行操作,是否有任何实际优势(例如避免不必要的副作用)?

Rem*_*eau 13

将一个单元添加到该部分的uses子句implementation允许该单元仅作为私有依赖implementation,而不是interface.如果UnitA使用UnitB,但UnitA之外没有人关心UnitA是否使用UnitB,因为UnitA的接口不使用UnitB,那么为什么要宣传依赖关系并使其混乱interface?此外,如果您需要删除UnitB和/或将其替换为其他内容,则在usesimplementation部分的条款中声明它可以避免interface更改会影响使用UnitA的任何单元.

  • +1除非需要,否则建议避免任何"引诱"循环引用.接口和实现之间的这种明确/强制/语法驱动的区别是我在Delphi中非常喜欢的,缺少Java或C#. (2认同)

Dav*_*nan 5

最大的问题是接口部分中的使用可能导致循环依赖和编译失败.如果单元A在接口部分使用单元B,则单元B不能在其接口部分使用单元A.

因此,您经常被迫将至少一些用途放入实现部分.

否则,我个人更愿意尽可能将单位使用放入界面部分.范围和隐藏的主要原因.如果存在名称范围冲突(两个单元定义相同的名称,第二个使用隐藏第一个),则整个单元中的相同名称都在范围内.

  • 我在非常大的代码库中使用了相反的方法,但我怀疑它在小代码中是否重要; 最小化Interface uses子句的大小.保持名称空间不受污染. (2认同)
  • 开发人员也倾向于在`implementation`区域中放置尽可能多的单元,这些单元对于`interface`是不必要的,例如`StrUtils`和`Math`,尽管这不一定会产生任何影响. (2认同)