命名空间
在 C# 教程的这一部分中,我们介绍了名称空间。
命名空间用于在最高逻辑级别上组织代码。 他们对公开给其他程序和应用的编程元素进行分类和呈现。 在一个名称空间内,我们可以声明另一个名称空间,一个类,一个接口,一个结构,一个枚举或一个委托。
我们无法定义诸如属性,变量和事件之类的项目。 这些项目必须在诸如结构或类之类的容器中声明。 当使用大量对象(例如类库)时,命名空间可防止歧义并简化引用。
命名空间在程序集中组织对象。 程序集是 CLR 应用的可重用,可版本控制和自描述的构建块。 程序集可以包含多个名称空间。 命名空间可以包含其他命名空间。 程序集提供了物理代码分组的基本单元。 命名空间提供了逻辑代码分组的基本单位。
C# 创建名称空间
namespace
关键字用于在 C# 中声明一个名称空间。 命名空间的名称必须是有效的 C# 标识符名称。 命名空间用.
运算符定界。 using
指令消除了为每个类指定名称空间名称的要求。
C# 内置名称空间
内置库在名称空间内组织。
Program.cs
public class Program
{
static void Main()
{
System.Console.WriteLine("Simple namespace example");
}
}
例如,Console
类在System
名称空间中可用。 要调用Console
类的静态WriteLine()
方法,我们使用其全限定名。 完全限定名称是对象引用,该引用以定义对象的名称空间的名称为前缀。
Program.cs
using System;
public class Program
{
static void Main()
{
Console.WriteLine("Simple namespace example");
}
}
通过using
语句,我们将System
命名空间包含到程序中。 现在我们可以调用Console.WriteLine()
而不显式指定System
。
C# 共享名称空间
在下面的代码中,我们有两个共享相同名称空间的文件。
Counter.cs
using System;
namespace Sharing
{
class Counter
{
public int x = 0;
public void Inc()
{
x += 100;
Console.WriteLine(x);
}
}
}
我们有一个Sharing
命名空间。 在命名空间中,我们有一个Counter
类。
namespace Sharing
{
...
}
我们声明一个名为Sharing
的命名空间。 该代码位于Sharing
名称空间的大括号内。
Program.cs
namespace Sharing
{
public class Program
{
static void Main()
{
var counter = new Counter();
counter.Inc();
counter.Inc();
}
}
}
在Program
类中,我们使用上一个文件中的Counter
类。 我们调用其Inc()
方法。
namespace Sharing
{
...
我们在同一个命名空间中工作。
var counter = new Counter();
counter.Inc();
counter.Inc();
我们创建Counter
类的实例。 我们两次调用它的Inc()
方法。 因为我们使用相同名称空间的对象,所以不需要显式指定其名称。
$ dotnet run
100
200
这是示例输出。
C# 不同的名称空间
以下代码示例具有两个不同的名称空间。 我们使用using
关键字从其他名称空间导入元素。
Basic.cs
namespace Mathematical
{
public class Basic
{
public static double PI = 3.141592653589;
public static double GetPi()
{
return PI;
}
}
}
在Basic
类中,我们定义了PI
常量和GetPi()
方法。 Basic
类在Mathematical
命名空间中定义。
Program.cs
using System;
using Mathematical;
namespace Distinct
{
public class Program
{
static void Main()
{
Console.WriteLine(Basic.PI);
Console.WriteLine(Basic.GetPi());
Console.WriteLine(Mathematical.Basic.PI);
Console.WriteLine(Mathematical.Basic.PI);
}
}
}
在此文件中,我们使用MyMath
命名空间中的元素。
using Mathematical;
我们将元素从MyMath
命名空间导入到我们的命名空间中。
Console.WriteLine(Basic.PI)
Console.WriteLine(Basic.GetPI())
现在我们可以使用这些元素。 在我们的例子中,它是Basic
类。
Console.WriteLine(Mathematical.Basic.PI);
Console.WriteLine(Mathematical.Basic.PI);
访问元素的另一种方法是指定元素的全限定名称。
$ dotnet run
3.141592653589
3.141592653589
3.141592653589
3.141592653589
这是输出。
C# 根名称空间
根名称空间是 .NET Framework 库的主空间。 有人可能会创建与 .NET Framework 中的类型或名称空间冲突的类型或名称空间。 在这种情况下,我们可以使用global::
前缀引用根名称空间。
Program.cs
namespace ZetCode
{
class System
{
public override string ToString()
{
return "This is System class";
}
}
public class Program
{
static void Main()
{
var sys = new System();
global::System.Console.WriteLine(sys);
}
}
}
在ZetCode
命名空间中,我们创建一个System
类,该类与.NET Framework 中的类冲突。
var sys = new System();
在这里,我们从ZetCode
命名空间引用System
类。
global::System.Console.WriteLine(sys);
使用global::
前缀,我们指向根名称空间的System
类。
C# 默认名称空间
根名称空间也是 C# 程序的默认名称空间。 命名空间中未包含的元素将添加到未命名的默认命名空间中。
Program.cs
using System;
struct Book
{
public override string ToString()
{
return "Book struct in a default namespace";
}
}
namespace MainProgram
{
struct Book
{
public override string ToString()
{
return "Book struct in a MainProgram namespace";
}
}
public class Program
{
static void Main()
{
Book book1;
global::Book book2;
Console.WriteLine(book1);
Console.WriteLine(book2);
}
}
}
我们有两个Book
结构; 一个在MainProgram
名称空间中定义,另一个在此名称空间之外定义。
struct Book
{
public override string ToString()
{
return "Book struct in a default namespace";
}
}
此Book
结构在名为MainProgram
的自定义命名空间之外定义。 它属于默认名称空间。
Book book1;
我们指的是MainProgram
名称空间内定义的结构。
global::Book book2;
使用global::
前缀,我们指向MainProgram
命名空间之外定义的结构。
$ dotnet run
Book struct in a MainProgram namespace
Book struct in a default namespace
这是程序的输出。
C# 名称空间别名
using
关键字可用于为名称空间创建别名。 使用嵌套的名称空间,全限定名称可能会变长。 我们可以通过创建别名来缩短它们。
Program.cs
namespace ZetCode
{
namespace Items
{
class Book
{
public override string ToString()
{
return "This is a book";
}
}
}
}
namespace MainProgram
{
using ZIB = ZetCode.Items.Book;
public class Aliases
{
static void Main()
{
ZetCode.Items.Book book = new ZetCode.Items.Book();
ZIB book2 = new ZIB();
System.Console.WriteLine(book);
System.Console.WriteLine(book2);
}
}
}
在示例中,我们为Book
类创建了一个别名,该别名被两个名称空间包围。
namespace ZetCode
{
namespace Items
{
class Book
{
...
}
}
}
可以将一个名称空间嵌套到另一个名称空间中。 Book
类的完全限定名称为ZetCode.Items.Book
。
using ZIB = ZetCode.Items.Book;
using
关键字为全限定名ZetCode.Items.Book
创建为ZIB
别名。
ZetCode.Items.Book book = new ZetCode.Items.Book();
ZIB book2 = new ZIB();
我们使用这两个名称来创建书籍实例。
C# 教程的这一部分专门用于名称空间。