Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 299 300 301 302 303 304 305 306 307 ... 642

  // Hexagon class

  public class Hexagon { /* Еще интересные методы... */ }

}

<b>// Square.cs</b>

namespace MyShapes

{

  // Square class

  public class Square { /* И еще интересные методы...*/}

}

На заметку! Рекомендуется иметь в каждом файле кода только один класс. В ряде приводимых ранее примеров такое правило не соблюдалось, но причиной было упрощение изучения. В последующих главах каждый класс по возможности будет располагаться в собственном файле кода.

Обратите внимание на то, что пространство MyShapes действует как концептуальный "контейнер" для определяемых в нем классов. Когда в другом пространстве имен (скажем, CustomNamespaces) необходимо работать с типами из отдельного пространства имен, вы применяете ключевое слово using, как поступали бы в случае использования пространств имен из библиотек базовых классов .NET Core:

// Обратиться к пространству имен из библиотек базовых классов.

using System;

// Использовать типы, определенные в пространстве имен MyShapes.

using MyShapes;

Hexagon h = new Hexagon();

Circle c = new Circle();

Square s = new Square();

В примере предполагается, что файлы С#, где определено пространство имен MyShapes, являются частью того же самого проекта консольного приложения; другими словами, все эти файлы компилируются в единственную сборку. Если пространство имен MyShapes определено во внешней сборке, то для успешной компиляции потребуется также добавить ссылку на данную библиотеку. На протяжении настоящей главы вы изучите все детали построения приложений, взаимодействующих с внешними библиотеками.

Разрешение конфликтов имен с помощью полностью заданных имен

Говоря формально, вы не обязаны применять ключевое слово using языка C# при ссылках на типы, определенные во внешних пространствах имен. Вы можете использовать полностью заданные имена типов, которые, как упоминалось в главе 1, представляют собой имена типов, предваренные названиями пространств имен, где типы определены. Например:

// Обратите внимание, что пространство имен MyShapes больше не импортируется!

using System;

MyShapes.Hexagon h = new MyShapes.Hexagon();

MyShapes.Circle c = new MyShapes.Circle();

MyShapes.Square s = new MyShapes.Square();

Обычно необходимость в применении полностью заданных имен отсутствует. Они требуют большего объема клавиатурного ввода, но никак не влияют на размер кода и скорость выполнения. На самом деле в коде CIL типы всегда определяются с полностью заданными именами. С этой точки зрения ключевое слово using языка C# является просто средством экономии времени на наборе.

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

Тем не менее, полностью заданные имена могут быть полезными (а иногда и необходимыми) для избегания потенциальных конфликтов имен при использовании множества пространств имен, которые содержат идентично названные типы.

Предположим, что есть новое пространство имен My3DShapes, где определены три класса, которые способны визуализировать фигуры в трехмерном формате:

// Еще одно пространство имен для работы с фигурами.

// Circle.cs

namespace My3DShapes

{

  // Класс для представления трехмерного круга.

  public class Circle { }

}

// Hexagon.cs

namespace My3DShapes

{

  // Класс для представления трехмерного шестиугольника.

  public class Hexagon { }

}

// Square.cs

namespace My3DShapes

{

  // Класс для представления трехмерного квадрата.

  public class Square { }

}

Если теперь вы модифицируете операторы верхнего уровня, как показано ниже, то получите несколько ошибок на этапе компиляции, потому что в обоих пространствах имен определены одинаково именованные классы:

// Масса неоднозначностей!

using System;

using MyShapes;

using My3DShapes;

// На какое пространство имен производится ссылка?

Hexagon h = new Hexagon(); // Ошибка на этапе компиляции!

Circle c = new Circle();   // Ошибка на этапе компиляции!

Square s = new Square();   // Ошибка на этапе компиляции!

Устранить неоднозначности можно за счет применения полностью заданных имен:

// Теперь неоднозначности устранены.

My3DShapes.Hexagon h = new My3DShapes.Hexagon();

My3DShapes.Circle c = new My3DShapes.Circle();

MyShapes.Square s = new MyShapes.Square();

Разрешение конфликтов имен с помощью псевдонимов

Ключевое слово using языка C# также позволяет создавать псевдоним для полностью заданного имени типа. В этом случае определяется метка, которая на этапе компиляции заменяется полностью заданным именем типа. Определение псевдонимов предоставляет второй способ разрешения конфликтов имен. Вот пример:

using System;

1 ... 299 300 301 302 303 304 305 306 307 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий