命名空间
namespace
关键字用于声明包含一组相关对象的作用域。 可以使用命名空间来组织代码元素并创建全局唯一类型。
namespace SampleNamespace
{
class SampleClass { }
interface ISampleInterface { }
struct SampleStruct { }
enum SampleEnum { a, b }
delegate void SampleDelegate(int i);
namespace Nested
{
class SampleClass2 { }
}
}
文件范围的命名空间声明使你能够作出以下声明:一个文件中的所有类型都在一个命名空间中。 C# 10 中可使用文件范围的命名空间声明。 以下示例与前面的示例类似,但使用了一个文件范围的命名空间声明:
using System;
namespace SampleFileScopedNamespace;
class SampleClass { }
interface ISampleInterface { }
struct SampleStruct { }
enum SampleEnum { a, b }
delegate void SampleDelegate(int i);
使用文件作用域命名空间中的语句
使用 文件范围的命名空间时,语句的位置 using
会影响其在文件中的范围。 文件范围的命名空间低于等效的传统命名空间声明,该声明以文件末尾的右括号结尾。 此行为确定在何处 using
应用指令,如下所示:
- 如果语句
using
放置在文件范围的命名空间声明之前,则它们被视为不在命名空间之外,并解释为完全限定的命名空间。 using
如果在文件范围的命名空间声明之后放置这些语句,则它们的范围在命名空间本身内。
例如:
// This using is outside the namespace scope, so it applies globally
using System;
namespace SampleNamespace; // File-scoped namespace declaration
// This using is inside the namespace scope
using System.Text;
public class SampleClass
{
// Class members...
}
在上面的示例中,System
全局可访问,而System.Text
仅适用于 .SampleNamespace
前面的示例不包括嵌套命名空间。 文件范围的命名空间不能包含其他命名空间声明。 不能声明嵌套的命名空间或第二个文件范围的命名空间:
namespace SampleNamespace;
class AnotherSampleClass
{
public void AnotherSampleMethod()
{
System.Console.WriteLine(
"SampleMethod inside SampleNamespace");
}
}
namespace AnotherNamespace; // Not allowed!
namespace ANestedNamespace // Not allowed!
{
// declarations...
}
在命名空间中,可以声明零个或多个以下类型:
编译器会添加默认命名空间。 此未命名的命名空间(有时被称为全局命名空间)存在于每个文件中。 它包含未包含在已声明的命名空间中的声明。 全局命名空间中的任何标识符都可用于已命名的命名空间。
命名空间隐式具有公共访问权限。 有关可以分配给命名空间中元素的访问修饰符的讨论,请参阅访问修饰符。
可以在两个或多个声明中定义一个命名空间。 例如,以下示例将两个类定义为 MyCompany
命名空间的一部分:
namespace MyCompany.Proj1
{
class MyClass
{
}
}
namespace MyCompany.Proj1
{
class MyClass1
{
}
}
以下示例显示如何在嵌套命名空间中调用静态方法。
namespace SomeNameSpace
{
public class MyClass
{
static void Main()
{
Nested.NestedNameSpaceClass.SayHello();
}
}
// a nested namespace
namespace Nested
{
public class NestedNameSpaceClass
{
public static void SayHello()
{
Console.WriteLine("Hello");
}
}
}
}
// Output: Hello
C# 语言规范
有关详细信息,请参阅 C# 语言规范中的命名空间部分。 有关文件范围命名空间声明的详细信息,请参阅功能规范。