Поделиться через


пространство имен

Ключевое слово 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...
}

В пространстве имен можно объявить ноль или больше следующих типов:

  • class
  • interface
  • struct
  • enum
  • delegate
  • вложенные пространства имен можно объявлять везде, кроме объявлений пространств имен с областью действия файла

Компилятор добавляет пространство имен по умолчанию. Это безымянное пространство имен, иногда называемое глобальным пространством имен, существует в каждом файле. Он содержит объявления, не включенные в объявленное пространство имен. Любой идентификатор в глобальном пространстве имен доступен для использования в именованном пространстве имен.

Об этом не говорится прямо, но пространства имен имеют открытый доступ. Описание модификаторов доступа, которые можно назначить элементам в пространстве имен, см. в разделе Модификаторы доступа.

Пространство имен можно определить в двух или нескольких объявлениях. Например, в следующем примере два класса определяются в качестве части пространства имен 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# 6.0. Дополнительные сведения об объявлениях пространств имен с областью действия файла см. в спецификации функций.

См. также