}
}
}
Неоднозначность разрешится, если использовать абсолютное имя типа
// Теперь неоднозначность ликвидирована.
static void Main(string[] args) {
Му3DShapes.Hexagon h = new My3DShapes.Hexagon();
My3DShapes.Circle с = new My3DShrapes.Circle();
MyShapes.Square s = new MyShapes.Square();
}
Использование псевдонимов
Ключевое слово C# using можно также использовать для создания псевдонимов абсолютных имен типов. После создания псевдонима вы получаете возможность использовать его как ярлык, который будет заменен полным именем типа во время компиляции. Например:
using System;
using MyShapes;
using My3DShapes;
// Ликвидация неоднозначности с помощью псевдонима.
using The3DHexagon = My3DShapes.Hexagon;
namespace MyApp {
class ShapeTester {
static void Main(string[] args) {
// На самом деле здесь создается тип My3DShapes.Hexagon.
The3DHexagon h2 = new The3DHexagon();
…
}
}
}
Этот альтернативный синтаксис using можно использовать и при создании псевдонимов для длинных названий пространств имен.
Одним из длинных названий в библиотеке базовых классов является System.Runtime.Serialization.Formatters.Binary. Это пространство имен содержит член с именем BinaryFormatter. Используя синтаксис using, экземпляр BinaryFormatter можно создать так, как показано ниже:
using MyAlias= System.Runtime.Serialization.Formatters.Binary;
namespace MyApp {
class ShapeTester {
static void Main(string[] args) {
MyAlias.BinaryFormatter b = new MyAlias.BinaryFormatter();
}
}
}
или же с помощью традиционного варианта использования директивы using.
using System.Runtime.Serialization.Formatters.Binary;
namespace MyApp {
class ShapeTester {
static void Main(string [] args) {
BinaryFormatter b = new BinaryFormatter();
}
}
}
Замечание.Теперь в C# предлагается и механизм разрешения конфликтов для одинаково названных пространств имен, основанный на использовании спецификатора псевдонима пространства имен (::) и "глобальной" метки. К счастью, указанный тип коллизий возникает исключительно редко. Если вам требуется дополнительная информация по этой теме, прочитайте мою статью "Working with the C# 2.0 Command Line Compiler" (Работа с компилятором командной строки C# 2.0), которую можно найти на страницах http://msdn.microsoft.com.
Вложенные пространства имен
Совершенствуя организацию своих типов, вы имеете возможность определить пространства имен в рамках других пространств имен. Библиотеки базовых классов .NET часто используют такие вложений, чтобы обеспечить более высокий уровень организации типа. Например, пространство имен Collections вложено в System, чтобы в результате получилась System.Collections. Чтобы создать корневое пространство имен, содержащее уже существующее пространство имен My3DShapes, можно изменить наш программный код так, как показано ниже.
// Вложение пространства имен.
namespace Chapter3 {
namespace My3DShapes {
// Трехмерный класс Circle.
class Circle{}
// Трехмерный класс Hexagon.
class Hexagon{}
// Трехмерный класс Square.
class Square{}
}
}
Во многих случаях единственной задачей корневого пространства имен является расширение области видимости, поэтому непосредственно в рамках такого пространства имен может вообще не определяться никаких типов (как в случае пространства имей Chapter3). В таких случаях вложенное пространство имен можно определить, используя следующую компактную форму.
// Вложение пространства имен (вариант 2).
namespace Chapters.My3DShapes{
// Трехмерный класс Circle.
class Circle{}
// Трехмерный класс Hexagon.
class Hexagon{}
// Трехмерный класс Square.
class Square{}
}
С учетом того, что теперь пространство имен My3DShapes вложено в рамки корневого пространства имен Chapter3, вы должны изменить вид всех соответствующих операторов, использующих директиву using и псевдонимы типов.
using Chapter3.My3DShapes;
using The3DHexagon = Chapter3.My3DShapes.Hexagon;
Пространство имен по умолчанию в Visual Studio 2005
В заключение нашего обсуждения пространств имен следует отметить, что при создании нового C#-проекта в Visual Studio 2005 имя пространства имен вашего приложения по умолчанию будет совпадать с именем проекта. При вставке новых элементов с помощью меню Project→Add New Item создаваемые типы будут автоматически помещаться в пространство имен, используемое по умолчанию. Если вы хотите изменить имя пространства имен, используемого по умолчанию (например, так, чтобы оно соответствовало названию вашей компании), используйте опцию Default namespace (Пространство имен по умолчанию) на вкладке Application (Приложения) окна свойств проекта (рис. 3.24).
Читать дальше