Java 或 C# 中的命名空间污染是否存在(如 C++)?
我对Java和C#如何处理命名空间的概念感到困惑。
首先,一些编程语言中的命名空间污染示例:
-
using namespace std
对于C++。业界的每个人都对此感到不满,但初学者在开始编程时仍然被教导这样做。下面是一个关于处理全局命名空间的建议的 SO 问题
-
import math.*
在 Python 中
在上Python课时,我被告知不建议这样做,因为它会污染命名空间,并且首先允许访问数学库中的所有方法,而不会在编写具有重复名称的方法时引起冲突。它显然也会导致解释器的更多工作,因为它导入了所有函数,甚至是那些未使用的函数。Math.functionname
-
在 Ocaml 中打开模块 在 toplevel 或 ML 文件中执行此操作也可能导致命名冲突。特别是在编写库时。
问题:
C#和Java中是否存在“命名空间污染”(即导入大量在编写方法时可能导致冲突的方法)(它们在很多方面都很相似)?为什么不呢?
当然,相关问题太相似了,不能问另一个问题:
-是因为也许我们必须明确地做事还是有某种预防措施?@Override
-或者它存在,但它不是一个东西,因为它不会像“使用命名空间std”那样造成太大的破坏,而且我不知道它对学术课上的软件开发相对较新?
例
我发现自己在C#中有很多库,以避免必须为变量重新键入命名空间,例如using
XElement
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//the ones above are auto-generated by Visual Studio, too
using System.Xml.Linq;
将避免我每次创建XElement时都必须这样做。就像我们总是要做的一样C++System.Xml.Linq.XElement
std::cout
或者在Java中,我经常看到:,甚至import java.util.linkedlist
import java.util.*
如果我的类在其他地方使用,它们不会造成命名空间污染吗?还是因为它们只会“污染”该特定类范围,而不会在可能导入或继承我的类的其他类中”
我试图搜索答案,但找不到答案,我可能错误地表达了搜索。
编辑 4/20/2015:
正如@RealSkeptic所提到的,事实证明,Java通配符导入也不鼓励。源
除了下面接受的答案和答案之外,Java 和 C# 中的导入都包含在它们自己中,因此即使有人使用通配符类型的导入将未使用的方法名称添加到命名空间,它也不会影响其他类。在类级别,如果确实发生名称冲突,Java 和 C# 编译器将引发错误,引用不明确的导入,并且无法进一步编译,直到问题得到解决(例如,通过重命名函数)。