【问题标题】:Importing nested namespaces automatically in C#在 C# 中自动导入嵌套命名空间
【发布时间】:2012-02-19 20:41:19
【问题描述】:

对不起,如果这个问题已经被问过了。 我开始学习 C# 并注意到 C# 不会自动导入嵌套命名空间。 我不明白:

using System;

应该自动导入包含在 System 命名空间中的所有类吧? 所以应该不用我写了

using System.Windows.Form;

我会理解using Windows.Form 是否有效。但是编译器无法解析!那么之前的using System; 有什么意义呢? 那么为什么using System; 不会像System.Windows.Forms 一样自动导入System.Windows - 抱歉,如果这里的导入这个词是错误的......也许移动到全局命名空间是正确的术语。

【问题讨论】:

  • C# 不能那样工作,在 Java 中,您可以使用通配符导入命名空间,但无论出于何种原因,C# 设计者都选择不这样做。我不确定讨论原因是否具有建设性。
  • Closters - 这是一个合理的问题。
  • @CodingGorilla:“为什么”不是辩论;有一个明确的原因(即,正如 Oded 所说,C# 命名空间是逻辑的,而不是物理分组)。

标签: c# .net


【解决方案1】:

“使用”语法允许您对已在项目设置中列为引用的命名空间进行速记访问。如果命名空间被列为引用,则您已经可以通过它的全名访问它,而无需“使用”指令。只是节省击键。

【讨论】:

    【解决方案2】:

    不,这不是它的工作方式。

    我会为你所说的提供一个很好的论据:intellisnse 会发疯,而找到你想要的东西将是地狱。

    您确实可以访问每个可用命名空间上的所有内容(带点),using 关键字简化了这一点,因为您不必指定类或结构“来自”哪个命名空间(我的意思是,定义)。

    【讨论】:

    • 我不会根据您选择的编辑器(例如:具有智能感知功能的编辑器)来创建功能。我会设计一个只考虑最简单的编辑器的功能(例如:notepad.exe)。
    • 为了避免依赖编辑器,我可以为编译器提出类似的论点:编译会更加困难,因为对于您使用的所有未在本地定义的东西,它必须检查每个您使用的每个模块的可能子树。除了困难和浪费之外,这还可能导致大量名称冲突。
    【解决方案3】:

    using 指令有两种用途:

    允许在命名空间中使用类型,这样您就不必 限定在该命名空间中使用类型:

    使用 System.Text;

    为命名空间或类型创建别名。这 被称为使用别名指令。

    使用 Project = PC.MyCompany.Project;

    http://msdn.microsoft.com/en-us/library/sf0df423.aspx

    但是,您必须注意 System 和 System.Windows.Form 无论如何都不是通过名称本身连接的。如果您导入(使用) System,则意味着您将在此类中使用 System 程序集类型。 您在参考部分中指定的实际参考在 Visual Studio 项目中您可以真正使用(即使没有 using 语句,因为这只是类型的快捷方式)。

    【讨论】:

    • +1。好点 - C# 允许跨程序集拆分命名空间,因此您的项目可能尚未导入(或想要导入)其他程序集。
    • 我才意识到我有多困惑。我一直混淆使用与导入?而且我认为它们一定是不同的东西.. C# 根本不导入类吗?我知道 C++ 和 Java 确实如此..
    • @LewsTherin - 在 .NET 中,您将 reference 添加到包含要“导入”的类型的程序集。
    • @Lews Therin:当然你应该使用“using”指令,因为它提高了代码的可读性,因为它缩短了给定类型的必要命名空间。
    • 在 C# 中使用别名导入类型非常方便。否则,仅使用命名空间中的一个类,您就可以导入整个命名空间。在编辑器中编码时,它会使用该命名空间中存在的一大堆类来扩展您的智能感知视图。
    【解决方案4】:

    C# 不是 Java。

    使用了using directive,因此您不必输入类型的完全限定名称。它还有助于消除类型名称的歧义(例如使用别名)。

    Console为例,您不需要输入System.Console

    理解命名空间和程序集之间的区别很重要——命名空间是类型的逻辑分组。程序集是类型的物理分组。命名空间可以跨越程序集。

    当您引用一个程序集(这更像是在 Java 中导入一个包)时,您可以访问其中的所有公共类型。为了使用一个类型,您需要唯一标识它。这是通过命名空间完成的 - using 指令仅仅意味着您不必键入类型的完全限定名称。

    【讨论】:

    • 所以 using 将导入当前命名空间中的所有类,但是当它遇到嵌套命名空间时会忽略它?除非我明确指定..这是重点吗?
    • @LewsTherin - 这不是“忽略”它。您只是没有指定“快捷方式”。使用using 指令,因此您不必指定类型的完整“路径”。如果需要,您可以使用该类型的完整路径访问该类型,但使用 using 指令可以确保您不必输入太多...
    • 添加对程序集的引用意味着“将此程序集的所有类型加载到默认 AppDomain”,通过 using 指令您只需告诉您的代码哪些类型是可见目前。
    • @Oded 我想我明白你的意思了。因此,添加引用就像导入或 #include 一样,并且会“复制并粘贴”到当前文件中。但是要将类移动到全局命名空间,我们使用 using。这就是区别所在?
    • @Restuta - 不完全是。您仍然可以使用没有 using 指令的类型的完全限定名称。我会将该评论修改为“哪些类型是直接可见的”。
    【解决方案5】:

    C# 不导入嵌套命名空间,这是设计使然。

    命名空间范围可让您组织代码并为您提供创建方法 全局唯一类型。

    嵌套命名空间用于对相关功能进行分组,但可以按需使用其中的一部分。

    如果您唯一需要的是System.Windows,我猜您不会希望拥有像System 这样大的命名空间中的所有类型。

    所以问题可能是为什么 C# 没有像 java 那样的 using System.*; 。我不知道答案,但我猜这是因为 KISS 原则。这有点像使用

    select *

    您永远不会知道您将添加哪些类型以及它们将如何影响现有代码。

    【讨论】:

      【解决方案6】:

      “使用”一个给定的命名空间意味着您可以访问所有在其中直接实现的定义,而不是递归查找嵌入的命名空间;否则会破坏“使用”声明的目的。

      存在命名空间是为了避免类名歧义。 “Using”语句是为了避免使用嵌套在命名空间中的完全限定类型,当您知道不会发生(或很少)歧义时。

      【讨论】:

        【解决方案7】:

        即使在 Java 中,您也必须显式编写

        import System.*;
        

        很多时候您并不想要所有嵌套的命名空间。这些只会使 IntelliSense 混乱。

        【讨论】:

          猜你喜欢
          • 2012-07-23
          • 2010-09-16
          • 2011-03-13
          • 1970-01-01
          • 2011-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-03
          相关资源
          最近更新 更多