1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 82
Текст из файла (страница 82)
Solution Explorer будет описан в главе 21, "Использование интерфейсаVisual Studio".420Часть VII. Дополнительные главыВ Visual Studio, а также в C#, Visual Basic .NET и прочих языках .NET один проектсоответствует одному скомпилированному модулю — в .NET он носит имя сборка.С# может создавать два основных типа сборок — выполнимые файлы (с расширением .ЕХЕ) и библиотеки классов (.DLL). Выполнимые файлы представляют собой программы сами по себе и используют код поддержки из библиотек.
Во всей этой книге создавались исключительно выполнимые файлы. Что касается библиотек классов, то опять жевсе программы в книге их используют. Например, пространство имен S y s t e m — месторазмещения таких классов, как String, Console, Exception, Math и O b j e c t — существует как набор библиотечных сборок. Каждой программе требуются классы System.Библиотеки не являются самостоятельными выполнимыми программами.Библиотека классов состоит из одного или нескольких классов, обычно работающихвместе тем или иным способом.
Зачастую классы в библиотеках находятся в своем собственном пространстве имен (namespace). (О них речь пойдет в следующем разделе.)Вы можете построить библиотеку математических подпрограмм, библиотеку для работысо строками, библиотеку классов-фабрик и т.д.Небольшие программы обычно состоят из одной сборки programName.ехе. Однако часто создаются решения, состоящие из нескольких отдельных (но связанных) проектов, как упоминалось в предыдущем разделе. Каждый из них компилируется в отдельнуюсборку. В решении вы можете объединять и .
ЕХЕ-, и . DLL-файлы, что является обычной практикой ДЛЯ больших программ. Когда ВЫ строите многопроектное решение,сборки работают совместно, обеспечивая функциональность приложения в целом.Если решение содержит более одного . ЕХЕ-проекта, вы должны указать VisualStudio, какой проект является начальным (startup project). Именно он будет запускаться при выборе команды меню Debug^Start Debugging (F5) or DebugsStart Without Debugging (<Ctrl+F5>). Для указания начального проекта щелкните на нем правой кнопкой мыши в окне Solution Explorer и выберите в раскрывающемся меню команду Set as Startup Project. Имя начального проекта в окнеSolution Explorer выделяется полужирным шрифтом.
О Solution Explorer речьпойдет в главе 21, "Использование интерфейса Visual Studio".Большие программы обычно разделяют свои компоненты на один выполнимый файли несколько библиотек. Например, весь код, связанный с заказом билетов в рассматривавшемся ранее приложении, может находиться в одной библиотеке, работа с Интернетом —в другой, а управление базами данных — в третьей. Когда такая программа устанавливается на компьютер пользователя, процесс инсталляции включает копирование ряда файлов всоответствующие места на диске компьютера, причем многие из них являются .DLLфайлами, или просто "DLL" на сленге программистов (DLL означает dynamic link library(динамически компонуемые библиотеки) — код, который загружается в память тогда, когда в нем возникает необходимость при запуске используемой программы).taa 19. Работа с файлами и библиотеками421Иногда бывает так, что все решение представляет собой не что иное, как библиотекклассов, а не выполняемую программу. (Обычно при разработке такой библиотеки создается также сопутствующий .
ЕХЕ-проект, именуемый драйвером, который предназначен для тестирования библиотеки в процессе разработки. Однако при выпуске готовойбиблиотеки для других программистов вы поставляете им только . DLL, но не . ЕХЕа также, надеюсь, документацию к этим классам!)Как создавать собственные библиотеки классов, будет рассказано немного позжев этой главе.Пространства имен существуют для того, чтобы можно было поместить связанныклассы в "одну корзину", и для снижения коллизий между именами, используемыев разных местах. Например, вы можете собрать все классы, связанные с математическими вычислениям, в одно пространство имен MathRoutines.Можно (но вряд ли будет сделано на практике) разделить на несколько пространствимен один исходный файл.
Гораздо более распространена ситуация, когда несколькофайлов группируются в одно пространство имен. Например, файл Point.cs может со=держать класс Point, а файл T h r e e D S p a c e . c s — класс ThreeDSpace, описывающий свойства Евклидова пространства. Вы можете объединить Point.cs, ThreeDSpace . cs и другие исходные файлы С# в пространство имен MathRoutines (и, вероятно, в библиотечную сборку MathRoutines).
Каждый файл будет помещать свой кодв одно и то же пространство имен. (В действительности пространство имен составляютклассы в этих исходных файлах, а не файлы сами по себе.)Пространства имен служат для следующих целей.Пространства имен помещают груши к грушам, а не к яблокам. Как прикладной программист, вы можете не без оснований предполагать, что все классы,составляющие пространство имен MathRoutines, имеют отношение к математическим вычислениям. Так что поиск некоторой математической функции следуетначать с просмотра классов, составляющих пространство имен MathRoutines.Пространства имен позволяют избежать конфликта имен.
Например, библиотека для работы с файлами может содержать класс Convert, который преобразует представление файла одного типа к другому. В то же время библиотека перевода может содержать класс с точно таким же именем. Назначая этим двум множествам классов пространства имен FilelO и TranslationLibrary, выустраняете проблему: класс FilelO. Convert, очевидно, отличается от классаTranslationLibrary.Convert.Объявление пространств именПространства имен объявляются с использованием ключевого слова namespace, закоторым следует имя и блок в фигурных скобках. Классы в этом блоке являются частьюпространства имён,namespaceMyStuff{422Часть VII. Дополнительные главыclass MyClass {}class UrClass {}}В этом примере классы MyClass и UrClass являются частью пространства именMyStuff.Кроме классов, пространства имен могут содержать другие типы, такие как структуры иинтерфейсы.
Одно пространство имен может также содержать вложенные пространства именс любой глубиной вложенности. У вас может быть пространство имен Namespace2, вложенное в Namespacel, как показано в следующем фрагменте исходного текста:namespace Namespacel{// Классы в Namespacelnamespace Namespace2{// Классы в Namespace2public class Class2public void AMethod() { }}}}Для вызова метода из Class2 в Namespace2 откуда-то извне пространства именNamespacel применяется следующая запись:Namespacel.Namespace2.Class2.AMethod();Пространства имен неявно открыты, так что для них нельзя использовать спецификаторы доступа, даже спецификатор public.Удобно добавлять к пространствам имен в ваших программах название вашейфирмы: MyCompany .MathRoutines. (Конечно, если вы работаете на фирме.Вы можете также использовать свое собственное имя.
Я бы мог применять длясвоих программ что-то наподобие CMSCo.MathRoutines или Sphar.MathRoutines.) Добавление названия фирмы предупреждает коллизии имен в вашемкоде при использовании двух библиотек сторонних производителей, у которых оказывается одно и то же базовое имя пространства имен, например, MathRoutines.Такие "имена с точками" выглядят как вложенные пространства имен, но на самомделе это одно пространство имен, так что System. Data — это полное имя Пространства имен, а не имя пространства имен Data, вложенного в пространство имен System.Такое соглашение позволяет проще создавать несколько связанных пространств имен,таких как System. 10, System.
Data и System. Text.Visual Studio Application Wizard помещает каждый формируемый им классв пространство имен, имеющее такое же имя, как и создаваемый им каталог.Взгляните на любую программу в этой книге, созданную Application Wizard.Например, программа AlignOutput размещается в папке AlignOutput.Имя исходного ф а й л а — Program.cs, соответствующее имени класса поумолчанию.
Имя пространства имен в Program.cs то же, что и имя папки:AlignOutput. (Можно изменить любое из этих имен, только делайте это осторожно и аккуратно. Изменение имени общего пространства имен проектавыполняется в окне Properties проекта.)Глава 19. Работа с файлами и библиотеками423Если вы не помещаете ваши классы в пространство имен, С# сам поместит их в глобальное пространство имен.
Однако лучше использовать собственные пространства имен.Важность пространств именСамое важное в пространствах имен с практической точки зрения то, что отрасширяют описание управления доступом, о котором говорилось в главе 11,"Классы" (где были введены такие ключевые слова, как public, privateprotected, internal и protected internal). Пространства имен расширяют управление доступом с помощью дальнейшего ограничения на доступк членам класса.Реально пространства имен влияют не на доступность, а на видимость. По умолчанию.классы и методы в пространстве имен NamespaceA невидимы классам в пространствеимен NamespaceB, независимо от их спецификаторов доступа.