【问题标题】:Understanding namespaces and their use better更好地理解命名空间及其使用
【发布时间】:2016-09-24 10:33:58
【问题描述】:

一篇关于命名空间的文章说

命名空间是 C# 程序元素,旨在帮助您组织 程式。他们还为避免名称冲突提供帮助 在两组代码之间。在您自己的代码中实现命名空间是 一个好习惯,因为它可能会让你在以后遇到问题时 你想重用你的一些代码。例如,如果您创建了一个 名为 Console 的类,您需要将其放在您自己的命名空间中 确保没有任何混淆 System.Console 的时间 应使用类或何时应使用您的类。

现在想象一下,就像上面的语句一样,我确实在我的命名空间中创建了一个 Console 类,名为:myNamespace

现在,当有人想使用我的图书馆时,他/她必须这样做:

using myNamespace;

但她可能需要这样做

using System;

也是。

所以我们还是有冲突。如果我输入Console,我指的是哪个控制台? 使用命名空间如何解决这个问题?

附言。额外:还有命名空间如何在幕后工作:我记得在某处我读过编译器只是在函数前面加上命名空间来查找它们的定义?

是这个吗?命名空间真的只是对代码进行分组的一种手段吗?

【问题讨论】:

  • 在命名空间和使用正确之前不会编译。如果您在命名空间中使用不模糊的属性,那很好。
  • @SebastianSchulz 不明白你想说什么
  • 在纠正所有错误之前,您无法编译您的 C# 项目。如果使用了不明确的类/属性,编译器将显示错误。您可以使用类的完整限定名来更正如下错误:myNameSpace.Console.....

标签: c# namespaces


【解决方案1】:

@user200300,已经有很多人为你的问题描述给出了确切的代码解决方案。但让我试着解释清楚。命名空间也有助于避免名称冲突。

例如:假设有一个名为 Stackoverflow 的项目,它包含两个团队,分别是 TeamA 和 TeamB。

namespace Stackoverflow 
{
namespace TeamA
 {
   class classA
    {
       public static void Print()
       {
      Console.WriteLine("Print A");
       }
    }
 }
}


namespace Stackoverflow 
{
namespace TeamB
 {
   class classA
    {
       public static void Print()
       {
      Console.WriteLine("Print B");
       }
    }
 }
}

TeamA 和 TeamB 团队都在尝试修改同一个类 classA。命名空间有助于以有效且适当的可访问方式组织代码。 如果您想从这些命名空间之外的任何团队或任何类访问 print 方法,您可以这样编写

Stackoverflow.TeamA.classA.Print();
Stackoverflow.TeamB.classA.Print();

所以上面的代码繁琐冗长,而且不干净。因此可以使用别名。

using STAP=Stackoverflow.TeamA;
using STBP=Stackoverflow.TeamB();

现在您可以轻松访问了。

STAP.classA.print();//TeamA's print method.

因此一个命名空间可以包含Namespace,Class,Interface,struct,enum,delegate

【讨论】:

    【解决方案2】:

    更好的解决方案是避免使用会导致冲突的名称。将您的控制台命名为其他名称,以便在需要时明确使用哪个。

    【讨论】:

      【解决方案3】:

      您不会同时包含两个 using 语句。 你选择,所以你的代码看起来更干净:

      using System;
      
      public static void Main()
      {
          Console.WriteLine("I'm here!");
          myNameSpace.Console.PopBeer("Mo beer!"); 
      }
      

      出于实际目的,如果您的命名空间非常长,您也可以使用别名:

      using System;
      using sexyNs = myProject.AwesomeSolution.Helpers;
      
      public static void Main()
      {
          Console.WriteLine("I'm here!");
          sexyNs.Console.PopBeer("Mo beer!"); 
      }
      

      【讨论】:

      • 啊哈,这是有道理的。另外,如果您能回答我的问题的额外部分,那就太好了。
      • 是的,编译器通常会为正在编译的每个符号生成一个超短的唯一命名空间,以保持引用不变。在您的代码中,编译器将无法理解使用相同名称的 2 个命名空间(在此示例控制台中),但如果您像我一样选择或使用别名(如其他答案),它将编译并预先添加一些内容生成的对象的前面。 :)
      【解决方案4】:

      程序将无法编译。你需要像这样实例化你的类:

      System.Console.WriteLine("hi");
      myNamespace.Console y = .... ;
      

      【讨论】:

        【解决方案5】:

        如果您同时使用这两个命名空间,则必须完全限定用法(System.Console()),或者使用命名空间/类型别名(Console2)来消除类型的歧义。

        using Console1 = myNamespace;
        using Console2 = System;
        
        public void MyMethod()
        {
         Console1.Console(); // or myNamespace.Console()
         Console2.Console(); // or System.Console()
        }
        

        【讨论】:

        • 您能否提供不带别名的示例?我不熟悉它
        • 查看 cmets。如果您不想使用别名。无论您想在哪里使用控制台。您必须提供完整的命名空间。例如System.Console(); or myNamespace.Console(); 在任何你想使用它的地方。
        猜你喜欢
        • 2015-11-09
        • 2014-10-17
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        • 2020-06-20
        • 2021-08-26
        • 2011-04-17
        • 2019-03-24
        相关资源
        最近更新 更多