【问题标题】:Why use fully-qualified names? [closed]为什么要使用完全限定名称? [关闭]
【发布时间】:2023-03-09 09:28:01
【问题描述】:

既然引入了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();

这里的最佳做法是什么?

【问题讨论】:

  • 有什么意义?如果有歧义,代码无论如何都将无法编译...只需使用using 子句,并在(通常很少见的)歧义情况下使用完全限定名称...
  • 为什么不走得更远 - 为什么使用像“Point”和“Stream”这样长的名字,当 2-3 个字符就足够了,比如“pPx”和“s$e”(而你也会在混淆器上节省一大笔钱)。
  • @Thomas,代码可能无法编译,但不能保证。
  • @l33t,好吧,你能给我一个歧义编译成功的例​​子吗?这是 C# 语言中最重要的原则之一:编译器从不尝试猜测;如果有疑问,它会失败并让您解决歧义。如果成功,则可以确定当前作用域中没有其他同名符号。

标签: c# .net vb.net namespaces


【解决方案1】:

命名空间真正有用的原因如下:

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

正如 Oded 所提到的,仅这些原因就非常重要 - 虽然不常见,但歧义并非不可能,在这种情况下使用命名空间将是必要的。

详细了解命名空间here

【讨论】:

  • 实际上,哪些是非常好的“东西”。
【解决方案2】:

使用了命名空间
1. 定义范围
2. 在不同的命名空间/项目/程序集中区分相同的类名。

var 的使用无论如何都没有链接到命名空间。命名空间别名处理的类型更少。

Using Namespaces

【讨论】:

    【解决方案3】:

    我认为您的问题实际上是 为什么要使用完全限定名称? 而不是 为什么要使用命名空间?

    命名空间在任何Object Oriented 语言中都非常重要。如果您有 2 个具有相同名称的类(这在 .NET 框架中已经经常发生),您应该如何区分它们?这就是命名空间的意义——如果在同一个命名空间中有 2 个同名的类,则代码将无法编译。 (当然,除非它们是部分类,这是完全不同的故事)。

    我经常遇到的这种情况是List。我们在这里的几个项目中使用NHibernate,它有自己的List。如果我要实例化 List,我就不能这样做:

    var list = new List<string>();
    

    .. 因为编译器不知道我想要NHibernate.Mapping.List 还是System.Collections.Generic.List

    var 关键字对于 type inference 非常有用,但如果您没有正确的 using 语句或 Fully Qualified 名称在另一端,这将无济于事。

    【讨论】:

      【解决方案4】:

      这似乎不是关于命名空间,而是更多关于在代码中使用静态类型。我听到的关于不使用var 的主要论点延伸到当变量类型通过查看声明时不明显时。考虑以下代码:

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

      你到底怎么知道readyTasks 是什么?考虑到Where() 返回的内容,IEnumerable 是给定的,但除此之外,摆脱这种类型的唯一方法是将鼠标悬停在 var 上并让 Visual Studio 为您找出它。随着 LINQ 语句变得更长,可枚举项被插入到 foreach 循环等逻辑结构中,这变得更加复杂,这个列表还在继续。

      var(我就是其中之一)的支持者会反驳说,从长远来看,这是一件小事,可以让var 为您带来更少的麻烦。静态类型声明从来都不是程序员舒适度的考虑因素。它们首先适用于编译器。因此,仅仅因为你已经习惯了就持有这个神器似乎没有任何意义。

      【讨论】:

      • 我强烈反对这一点。上面的代码需要一个类型引用。有时,您必须在该 PC 上没有 Visual Studio 的工作副本的情况下快速查看文本代码。 “使用 var 悬停”并不总是可用。
      【解决方案5】:

      对于一次性测试应用程序(例如检查堆栈溢出答案),我不使用命名空间。对于其他任何事情,我都愿意。这只是一个组织的事情——如果你要重用代码,将它与你也在同一上下文中重用的其他代码分开会很有帮助。我的意思是,如果您正在使用 LibraryX 和 LibraryY 创建应用程序,那么能够在应用程序中区分它们是很有用的。例如,它们可能都使用相同的类名 - 如果您不使用命名空间,这会使代码变得丑陋。

      除此之外,如果您使用 Visual Studio 进行编码,实际上不包含命名空间的工作量更大 - 您必须修改项目以为其提供一个空的默认命名空间。

      有关命名的信息,请参阅:Namespace Naming Convention

      【讨论】:

        猜你喜欢
        • 2019-10-09
        • 2014-08-01
        • 2014-04-16
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        • 1970-01-01
        相关资源
        最近更新 更多