为什么要使用完全限定名称?

3
var 关键字引入以来,为什么还要使用完全限定名称呢? var 有效地减少了变量声明的打字量。因此,可以在不膨胀代码的情况下保留完整的声明。这让我想知道,为什么你还需要声明 namespace 的使用?
// A lot of typing, but unambiguous.
System.Drawing.Point a = new System.Drawing.Point();

// using System.Drawing, Point possibly ambiguous.
Point b = new Point();

// using System.Drawing, Point possibly ambiguous.
var c = new Point();

// Less typing, still unambiguous.
var d = new System.Drawing.Point();

这里的最佳实践是什么?

1
有什么意义呢?如果存在歧义,代码编译时会失败...只需使用using子句,在(通常很少出现的)有歧义的情况下使用完全限定名称即可... - Thomas Levesque
3
为什么不走得更远——使用“Point”和“Stream”这样的长名称,为什么不用两三个字符就足够了,比如“pPx”和“s$e”(你还可以在混淆器上节省一大笔钱)。 - Alexei Levenkov
@Thomas,这段代码可能无法编译通过,但不是一定会失败。 - l33t
@l33t,那你能给我一个二义性编译成功的例子吗?这是C#语言中最重要的原则之一:编译器从不尝试猜测;如果存在疑问,它会失败并让您解决歧义。如果成功,则可以确保当前作用域中没有另一个具有相同名称的符号。 - Thomas Levesque
5个回答

13

命名空间实际上只有几个有用的原因:

  1. 帮助区分具有相同名称的类
  2. 帮助将项目“结构化”成有意义的部分

正如Oded所提到的,仅凭这些原因就足够重要 - 尽管不常见,但混淆是可能的,在这种情况下使用命名空间是必要的。

了解有关命名空间的更多信息,请在此处查找。


4
这些实际上是非常好的“东西”拥有。 - Oded

9

这似乎不太与命名空间有关,而更多地涉及到代码内部使用静态类型。我听过的不使用var的主要论点是,在查看声明时变量类型不容易明显。考虑以下代码:

var readyTasks = _config.GetTasks().Where(x => x.Ready);

你们到底如何知道 readyTasks 是什么呢?考虑到 Where() 返回的内容,IEnumerable 已经是一个确定的类型了,但如果想要获取更多类型信息,唯一的方法就是将鼠标悬停在 var 上,让 Visual Studio 帮你找出来。随着 LINQ 语句变得越来越长,可枚举对象被推进逻辑结构(比如 foreach 循环),情况会变得更加复杂。
支持使用 var 的人(我就是其中之一)会反驳说,在长远考虑中,这些小小的烦恼根本微不足道,而使用 var 可以为你带来数不清的便利。静态类型声明从来都不是程序员舒适度的考虑因素,它们首先是为编译器而设计的。因此,仅仅因为习惯而坚持使用这种过时的写法似乎没有意义。

5
我强烈不同意这个观点。上述代码需要类型引用。有时候你需要快速地在没有 Visual Studio 工作副本的电脑上查看代码文本。“悬停 var”并不总是可用的。 - PRMan

3
我觉得你的问题实际上是“为什么要使用完全限定名称?”,而不是“为什么要使用命名空间?”。
在任何面向对象的语言中,命名空间都非常重要。如果你有两个同名的类(在.NET框架中经常发生这种情况),你怎么区分它们?这就是命名空间的作用。如果在同一个命名空间中有两个同名的类,则代码将无法编译。(当然,除非它们是部分类,那就是另外一回事了)。
我经常遇到的一个例子是List。我们在几个项目中使用NHibernate,它有自己的List。如果我要实例化一个List,我不能只这样做:
var list = new List<string>();

因为编译器不知道我想要一个NHibernate.Mapping.List还是System.Collections.Generic.List,所以需要指明具体类型。

var关键字对于类型推断非常有用,但如果在另一端没有正确的using语句或Fully Qualified名称,则无法发挥作用。


1

命名空间的使用
1.用于定义范围
2.用于区分不同命名空间/项目/组件中相同的类名。

变量的使用与命名空间无关。命名空间别名可以减少输入的内容。

使用命名空间


1
对于一次性测试应用程序(例如检查Stack Overflow答案),我不使用命名空间。对于其他任何事情,我都会使用。这只是一个组织问题 - 如果您要重复使用代码,则将其与在相同上下文中还要重复使用的其他代码分开很有帮助。我的意思是,如果您正在使用LibraryX和LibraryY创建应用程序,则能够区分它们在应用程序中非常有用。例如,它们可能都使用相同的类名称 - 如果您不使用命名空间,这将使代码变得丑陋。
除此之外,如果您使用Visual Studio进行编码,实际上不包括命名空间更费力 - 您必须修改项目以给它一个空的默认命名空间。
有关命名的信息,请参阅:命名空间命名约定

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接