【发布时间】:2012-05-15 13:14:30
【问题描述】:
在我工作过的所有公司中,我最终都拥护一组核心库,这些库除了增强和扩展 .net 库外无济于事。通常我的命名空间以我们的公司名称开头,但子命名空间反映了System 命名空间的名称。
我打算更进一步,将 company 命名空间替换为 system 命名空间,这样您只需要一个 using 语句,从而更好地增强核心库。
namespace System.IO
{
public static class StreamExtensions
{
...
}
}
实际问题
现在我知道这是可能的,微软在他们自己的库中做到了,我已经看到在其他第三方库中做到了,但我想知道的是,如果有的话,这样做的长期影响是什么作为.net 更高版本中的类名冲突?有没有人这样做并且不得不处理一个复杂的问题,破坏了仅仅能够添加程序集引用的简单性?
更新
不幸的是,这已经变成了关于你是否应该这样做的更多辩论,这可能属于程序员。不雅地还有另一个SO question 确实问过这个问题,但这不是问题的重点。
我想知道是否存在会导致编译错误或奇怪行为的场景。唯一出现的两个论点是。
Microsoft 将方法添加到与库中扩展方法的签名相匹配的对象,但这是一个静音点,因为它不会影响扩展方法所在的命名空间,因为对象上的实现会优先。
其他人在他们的第三方库中做了同样的事情,我们有一个名字冲突。这更有可能是我们已经必须处理的问题,第三方库 ILM 将其他库合并到它们的程序集中。
需要说明的是,这是一个独立的库,它是供内部使用的,不能在外部使用,并且可以通过扩展方法扩展现有的系统库。
【问题讨论】:
-
如果您这样做的唯一原因是不必包含额外的命名空间,那么我建议您不要这样做。
-
@Nick 感谢您的评论,但基于什么理由?这是一个有效的陈述,但问题是什么意思。包括我自己在内的其他人都回避了这样做,因为对弄乱别人的命名空间有一种“直觉”的感觉,但没有人因此而说不要这样做。如果您有具体的事实原因,我很想听听。
-
我想这主要是因为“直觉”感觉它是错误的。好问题!
-
除了坚信命名空间应该与它定义的 dll 有一些模糊的相似之处。如果你与其他代码库合并会发生什么,他们做了类似的事情?命名空间旨在隔离代码,以避免您计划创建的混乱。
-
我自己实际上已经在自己的扩展库中使用了这种技术,我认为这样做并没有什么坏处。原因是您在技术上不是通过使用扩展“添加”到命名空间。您只是在某些类型上扩展功能。通过将其包含在我们公司的一个基础项目中,所有这些扩展方法都可供其他开发人员发现和使用,而无需包含额外的参考。至于这是否是一个糟糕的设计决定:这完全取决于你。确保您有唯一的名称并且不应该存在类冲突。
标签: c# .net namespaces