• Добро пожаловать на сайт - Forumteam.digital !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

3. Изучаем пространство имен C#.

Redman

<FORUMTEAM>
Команда форума
Регистрация
13.11.17
Сообщения
13.340
Реакции
8.377
Баллы
1.200
FTC
208¢
Вступление.

Предположим, что вы принимаете участие в некотором проекте, и в вашей команде три человека. После того как каждый участник закончил свою часть проекта, настало время собрать все написанные модули для компоновки. Вот здесь и могут возникнуть проблемы, связанные с названиями классов. Если названия классов совпадают в разных модулях, то при их компоновке в единое целое возникают ошибки, с которыми далеко не всегда можно быстро справиться.

Вот тут вам могут помочь пространства имен. Если проводить аналогии, то пространство имен можно сравнить с капсулой, в которой хранится ваш код. Например, если в предыдущем разделе поменять имя нашего класса на Console (вместо FirstApplication), то конфликтов не будет, так как стандартный класс Console "спрятан" внутри пространства имен System. То есть, используя пространства имен, вы можете избегать досадных ситуаций, связанных с использованием классов от других разработчиков.

Теперь пора узнать как же "готовить" пространства имен.

В качестве имени пространства имен может служить любой допустимый идентификатор, имя также может содержать точки.
Код:
namespace A
{
   // Код
}

namespace A.B
{
   // Код
}
Пространства имен могут содержать внутри себя следующие объявления:

вложенные пространства имен
namespace A
{
   // Код
   namespace B
   {
        class Test
        {
           public static void f()
           {
               System.Console.WriteLine("Test");
           }
        }
   }
}

namespace C
{
    class Test
    {
        static void Main()
        {
           A.B.Test.f(); // Вызов
        }
    }   
}
  • классы
  • структуры
  • интерфейсы
  • перечисления (enum)
  • делегаты
Последние четыре элемента будут рассмотрены в последующих уроках.


Также предусмотрена возможность добавлять в пространства имен элементы "на ходу".
Код:
namespace A
{
   class T1
   {
       // Код
   }
}

namespace B
{
   // Код
}

namespace A
{
   class T2
   {
       // Код
   }
}
В приведенном выше примере класс T2 добавлен в пространство имен A после объявления самого пространства имен.

Надеемся, вы понимаете, что создавать имена, подобные A или B, смысла немного. А если создавать понятные любому пользователю имена, то обращение к классам окажется слишком громоздким. Для выхода из подобных ситуаций служит директива using. Используя директиву using, вы можете переносить содержимое пространства имен в данную точку программы. Таким образом, вы избавляетесь от необходимости указывать пространство имен, в котором содержится требуемый вам код.
Код:
using System;

namespace Test
{
   class Message
   {
      // Вместо System.Console.WriteLine("Test message");
      Console.WriteLine("Test message");
   }
}
****** доступ к содержимому вложенных пространств имен (в данном случае пространства имен System) получен не будет. ******
Код:
using System;
using A;

namespace A
{
   // Код
   namespace B
   {
        class Test
        {
           public static void f()
           {
               Console.WriteLine("Test");
           }
        }
   }
}

namespace C
{
    class MainClass
    {
        static void Main()
        {
           A.B.Test.f(); // Правильный вызов
           // B.Test.f(); // Неправильный вызов
           // Test.f(); // Неправильный вызов
        }
    }   
}
using System;
using A;
using A.B;

namespace A
{
   // Код
   namespace B
   {
        class Test
        {
           public static void f()
           {
               Console.WriteLine("Test");
           }
        }
   }
}

namespace C
{
    class MainClass
    {
        static void Main()
        {
           A.B.Test.f(); // Правильный вызов
           Test.f(); // Правильный вызов
        }
    }   
}
Кроме вышеописанного, директива using позволяет создавать псевдонимы для пространств имен и классов, входящих в него.
Код:
using System;
using AliasAB = A.B;
using AliasABTest = A.B.Test;

namespace A
{
   // Код
   namespace B
   {
        class Test
        {
           public static void f()
           {
               Console.WriteLine("Test");
           }
        }
   }
}

namespace C
{
    class MainClass
    {
        static void Main()
        {
           AliasAB.Test.f(); // Правильный вызов
           AliasABTest.f(); // Правильный вызов
        }
    }   
}

Заключение.

Использовать собственные пространства имен вовсе не обязательно. Если вы не создаете свое пространство имен при написании кода, то код помещается в неименованное (или глобальное) пространство имен, которое существует в каждом файле. В этом случае код будет доступен из любого именованного пространства имен.

Элементы, описанные в пространстве имен (их список был приведен выше), не могут иметь модификаторов доступа private или protected.
 
Сверху Снизу