namespace
Słowo namespace
kluczowe służy do deklarowania zakresu zawierającego zestaw powiązanych obiektów. Przestrzeń nazw umożliwia organizowanie elementów kodu i tworzenie globalnie unikatowych typów.
namespace SampleNamespace
{
class SampleClass { }
interface ISampleInterface { }
struct SampleStruct { }
enum SampleEnum { a, b }
delegate void SampleDelegate(int i);
namespace Nested
{
class SampleClass2 { }
}
}
Deklaracje przestrzeni nazw o zakresie plików umożliwiają zadeklarowanie, że wszystkie typy w pliku znajdują się w jednej przestrzeni nazw. Deklaracje przestrzeni nazw o zakresie plików są dostępne w języku C# 10. Poniższy przykład jest podobny do poprzedniego przykładu, ale używa deklaracji przestrzeni nazw o zakresie pliku:
using System;
namespace SampleFileScopedNamespace;
class SampleClass { }
interface ISampleInterface { }
struct SampleStruct { }
enum SampleEnum { a, b }
delegate void SampleDelegate(int i);
Używanie instrukcji w przestrzeniach nazw o zakresie plików
W przypadku korzystania z przestrzeni nazw o zakresie plików umieszczanie instrukcji using
wpływa na ich zakres w pliku. Przestrzenie nazw o zakresie plików są niższe od równoważnej tradycyjnej deklaracji przestrzeni nazw, która kończy się nawiasem zamykającym na końcu pliku. To zachowanie określa, gdzie using
dyrektywy są stosowane w następujący sposób:
using
Jeśli instrukcje są umieszczane przed deklaracją przestrzeni nazw o zakresie pliku, są traktowane jako poza przestrzenią nazw i są interpretowane jako w pełni kwalifikowane przestrzenie nazw.- Jeśli instrukcje
using
są umieszczane po deklaracji przestrzeni nazw o zakresie pliku, są one objęte zakresem w samej przestrzeni nazw.
Na przykład:
// 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...
}
W powyższym przykładzie System
jest dostępny globalnie, ale System.Text
ma zastosowanie tylko w obrębie SampleNamespace
.
Powyższy przykład nie zawiera zagnieżdżonej przestrzeni nazw. Przestrzenie nazw o zakresie plików nie mogą zawierać dodatkowych deklaracji przestrzeni nazw. Nie można zadeklarować zagnieżdżonej przestrzeni nazw ani drugiej przestrzeni nazw o zakresie plików:
namespace SampleNamespace;
class AnotherSampleClass
{
public void AnotherSampleMethod()
{
System.Console.WriteLine(
"SampleMethod inside SampleNamespace");
}
}
namespace AnotherNamespace; // Not allowed!
namespace ANestedNamespace // Not allowed!
{
// declarations...
}
W przestrzeni nazw można zadeklarować zero lub więcej z następujących typów:
- class
- interface
- struct
- enum
- delegate
- zagnieżdżone przestrzenie nazw można zadeklarować z wyjątkiem deklaracji przestrzeni nazw o zakresie pliku
Kompilator dodaje domyślną przestrzeń nazw. Ta nienazwana przestrzeń nazw, czasami nazywana globalną przestrzenią nazw, znajduje się w każdym pliku. Zawiera deklaracje nieuwzględniane w zadeklarowanej przestrzeni nazw. Dowolny identyfikator w globalnej przestrzeni nazw jest dostępny do użycia w nazwanej przestrzeni nazw.
Przestrzenie nazw niejawnie mają dostęp publiczny. Aby zapoznać się z omówieniem modyfikatorów dostępu, które można przypisać do elementów w przestrzeni nazw, zobacz Modyfikatory dostępu.
Można zdefiniować przestrzeń nazw w co najmniej dwóch deklaracjach. Na przykład w poniższym przykładzie zdefiniowano dwie klasy w ramach MyCompany
przestrzeni nazw:
namespace MyCompany.Proj1
{
class MyClass
{
}
}
namespace MyCompany.Proj1
{
class MyClass1
{
}
}
W poniższym przykładzie pokazano, jak wywołać metodę statyczną w zagnieżdżonej przestrzeni nazw.
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
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz sekcję Przestrzenie nazw specyfikacji języka C#. Aby uzyskać więcej informacji na temat deklaracji przestrzeni nazw o zakresie plików, zobacz specyfikację funkcji.