更好地理解命名空间及其用法

时间:2016-05-26 12:14:03

标签: c# namespaces

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

  

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

现在假设我在上面的语句中确实在我的命名空间中创建了一个名为Console的{​​{1}}类。

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

myNamespace

但很可能她需要做

using myNamespace;

所以我们仍然有冲突。如果我输入using System; ,我指的是哪个控制台? 如何使用命名空间解决此问题?

PS。额外的:还有名称空间如何在幕后工作:我记得某些地方我读过编译器只是预编程函数,例如用命名空间来查找它们的定义?

这是吗?命名空间真的不仅仅是一种分组代码的方法吗?

5 个答案:

答案 0 :(得分:5)

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

using Console1 = myNamespace;
using Console2 = System;

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

答案 1 :(得分:4)

您不会同时包含两个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 :(得分:0)

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

Ninja

答案 3 :(得分:0)

更好的解决方案是避免使用导致冲突的名称。将您的控制台命名为其他内容,以便在需要时清楚显示您使用的控制台。

答案 4 :(得分:0)

@ user200300,已经有很多人为你的问题描述提供了确切的代码解决方案。但是让我试着清楚解释.Namespaces也提供了避免名字冲突的帮助。

例如:假设有一个名为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.Namespaces有助于以高效且适当的方式组织代码。 如果您想从这些名称空间之外的任何团队或任何类中访问print方法,那么您可以像

那样编写
Stackoverflow.TeamA.classA.Print();
Stackoverflow.TeamB.classA.Print();

所以上面的代码很麻烦且冗长而且不干净。可以使用强制别名。

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

现在您可以轻松访问。

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

因此命名空间可以包含命名空间,类,接口,结构,枚举,委托