命名空间减少大型应用程序的命名冲突。世界、国家或者一个家庭,都有自己的“命名空间”,有分而治之和各自为政的味道。
不同命名空间形式
- C++引入命名空间namespace,C#同样支持。
- Java使用package对应目录级别,更加严格,C#更加自由,不一定和目录对应。
- C# 6.0 引入命名空间static修饰符,以支持静态函数。比如using static System.Console, 这样可以直接用WriteLine而不用加前缀Console.
- 为了支援多级目录以及清晰的命名空间结构,C#/Java都支持命名空间分级,例如namespace xxx.yyy或package xxx.yyy. 毕竟命名空间不是实在的类型定义,更像是抽象的概念,支持嵌套很自然。
- 引用多级命名空间写的很麻烦,C#引入using <alias_name> = <namespace xxx.yyy...> 设定精简别名。注意,别名可以和已有类相同。
- 例如:using Console = System.Console;
- XML 也有命名空间,以便于区分不同domain元素和属性。
- Java/仓颉 用 package 支持不同命名空间。
命名空间通配符
- C# using 引入命名空间,不会嵌套包含内部命名空间,如需要,必须显式引入。
- Java 提供通配符 * 可引入仅当前级别的全部子命名空间。
全局引入命名空间
- C# 10.0 引入 global using,一个文件中用此方式,此工程其他地方都不需要,默认都会引用。此举大幅减少工程文件大量重复的using代码。
- VB.NET 同样提供项目级别配置的Imports作用于整个项目。
一定需要引入命名空间?
- C# 使用 string 不需要引入System命名空间,使用 String 就需要引入System.
何处引入命名空间?
尽管大部分情况下,引入命名空间放在源代码开始,但依然可以只在特定范围引入命名空间。
- C# 允许在命名空间里用using, 此处的using只作用于此命名空间。
