Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Пространство имен C#.

Вступление.

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

Вот тут вам могут помочь пространства имен. Если проводить аналогии, то пространство имен можно сравнить с капсулой, в которой хранится ваш код. Например, если в предыдущем разделе поменять имя нашего класса на 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.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru