public class Hexagon { // Более интересные методы }
// Класс Square
public class Square { // Еще более интересные методы }
}
Обратите внимание, что пространство имен MyShapes действует как контейнер для всех этих типов. Вы можете разбить единое пространство имен С# на несколько физических файлов. Для этого достаточно просто определить в разных файлах одно и то же пространство имен и поместить в него определения классов:
// circle.cs
namespace MyShapes {
using System;
// Класс Circle
class Circle { // Интересные методы }
}
// hexagon.cs
namespace MyShapes{
using System;
// Класс Hexagon
class Hexagon { // Более интересные методы }
}
// square.cs
namespace MyShapes {
using System:
// Класс Square
class Square { // Еще более интересные методы }
}
Если вам потребуется использовать эти классы внутри другого приложения, удобнее всего это сделать при помощи ключевого слова using:
// Используем объекты, определенные в другом пространстве имен
namespace MyApp {
using System;
using MyShapes;
class ShapeTester {
public static void Main() {
// Все эти объекты были определены в пространстве имен MyShapes
Hexagon h = new Hexagon();
Circle с = new Circle();
Square s = new Square();
}} }
Пространства имен могут быть использованы для разрешения конфликтов между именами объектов в тех ситуациях, когда в нашем приложении используются разные объекты с одинаковыми именами. Представим себе такую ситуацию: наш класс ShapeTester должен использовать новое пространство имен, которое называется My3DShapes. В этом пространстве имен определены три класса с теми же именами, но предназначенные для работы с трехмерными объектами:
// Еще одно пространство имен для геометрических фигур
namespace My3DShapes {
using System;
// Класс 3D Circle
class Circle{}
// Класс 30 Hexagon
class Hexagon{}
// Класс 3D Square
class Square{}
}
Если вы измените класс ShapeTester как показано ниже, результатом станут три ошибки компилятора, сообщающие о конфликте имен:
// В коде есть двусмысленности!
namespace MyApp {
using System;
using MyShapes;
using My3DShapes;
class ShapeTester {
public static void Main() {
// Неизвестно, к объектам какого пространства имен мы обращаемся
Hexagon h = new Hexagon();
Circle с = new Cirde();
Square s = new Square();
} }}
Проще всего избавиться от подобных конфликтов, указав для каждого класса его полное имя вместе с именем соответствующего пространства имен:
// Конфликтов больше нет
public static void Main() {
My3DShapes.Hexagonh = new My3DShapes.Hexagon();
My30Shapes.Circleс = new My3DShapes.Circle();
MyShapes.Squares = new MyShapes.SquareO:
}
Еще одна возможность избавиться от конфликтов имен — использовать для имен классов псевдонимы. Например:
namespace MyApp {
using System;
using MyShapes;
using My3DShapes;
// Создаем псевдоним для класса из другого пространства имен
using The3DHexagon = My3DShapes.Hexagon;
class ShapeTester {
public static void Main() {
MyShapes.Hexagon h = new MyShapes.Hexagon();
MyShapes.Circle с = new MyShapes.Circle();
MyShapes.Square s = new MyShapes.Square();
// Создаем объект при помощи псевдонима
The3DHexagon h2 = new The3DHexagon();
}}}
Последнее, что необходимо сообщить о пространствах имен, — то, что вы можете без каких-либо ограничений вкладывать одни пространства имен в другие. Такой подход очень часто используется в библиотеках базовых классов .NET для организации типов. Например, если вы хотите создать пространство имен более высокого уровня, в котором будет находиться наше пространство имен My3DShapes, это можно сделать следующим образом:
// Классы для геометрических фигур расположены в пространстве имен Chapter2Types.My3DShapes