Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 61

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 55 56 57 58 59 60 < 61 > 62 63 64 65 66 67 .. 320 >> Следующая

Еще раз об упаковке и распаковке
Как уже говорилось выше в этой главе, упаковка и распаковка - это наиболее удобный способ преобразования структурного типа в ссылочный, и наоборот. Основное назначение структур — возможность получения некоторых преимуществ объектной ориентации, но при более высокой производительности за счет размещения в стеке. Чтобы преобразовать структуру в ссылку на объект, необходимо упаковать ее экземпляр:
// Создаем и упаковываем нового сотрудника
EMPLOYEE Stan = new EMPLOYEE{EmpType.Grunt, "Stan". 10);
•object stanlnBox = stan;
134 Глава 2 • Основы языка С#
И Класс Circle
public class Circle { // Интересные методы }
Поскольку ШпІпІЗох относится к ссылочным типам данных, но при этом сохраняет внутренние значения исходного типа данных EMPLOYEE, вы можете использовать St-Iг во всех случаях, когда вам нужен объект, и при необходимости производить распаковку:
// Поскольку мы ранее произвели упаковку данных, мы можем распаковать их и производить операции с содержимым public void JnboxThisEmployeetobject о) {
Il Производим распаковку в структуру EMPLOYEE дли получения доступа //ко всей полям
EMPLOYEE temp = (EMPLOYEE)o;
Console.WriteLine(temp.name "is alive!");
}
Вызов этого метода может выглядеть следующим образом:
// Передаен упакованного сотрудника на обработку t.UnboxThisEmployee(stanlnBox);
Вспомним, что компилятор С# при необходимости автоматически производит упаковку. Поэтому вполне допускается передать объект stan (относящийся к типу EMPLOYEE) методу UnboxThіsEmployee() напрямую:
Il Stan будет упакован автоматически t.UnboxThіsEmp1oyee(stan);
Однако, поскольку вы определили метод UnboxThistirpioyeeC) таким образом, что он обязан принимать объект в качестве параметра, вам придется распаковать эту ссылку для получения доступа к полям структуры EMPLOYEE.
Код приложения Structures можно найти в подкаталоге Chapter 2.
Определяем пользовательские пространства имен
К этому моменту мы уже создали множество небольших тестовых программ, которые работают с существующими пространствами имен во вселенной .NET. При построении реальных приложений часто бывает очень полезным сгруппировать ваши типы данных в специально созданные для этой цели пространства имен. В С# эта операция производится при помощи ключевого слова namespace.
Предположим, что мы создаем набор геометрических классов. Один класс получит название Square (квадрат), второй - Cl rcle (окружность), атретий - Hexagon
(шестиугольник). Поскольку все эти классы относятся к геометрическим фигурам, мы принимаем решение сгруппировать их в общем пользовательском пространстве имен. Основных вариантов в нашем распоряжении два. Согласно первому, мы можем определить все классы в одном файле (shapesLib.cs):
// shapeslib.cs inamespace MyShapes
{
using System:
Определяем пользовательские имен 13 ї
//Класс Hexagon
public class Hexagon { // Более интересные методы } Класс Square
public class Square { Ii Еще более интересные методы }
I
Обратите внимание, что пространство имен MyShapes действует как контейнер для всех этих типов. Вы можете разбить единое пространство имен С# на несколько физических файлов. Для этого достаточно просто определить в разных файлах одно и то же пространство имен и поместить в него определения классов:
// circle.CS
namespace MyShapes [
using System; // Класс Circle
class Circle { Il Интересные методы )
}
//
namespace MyShapes
{
using System;
Класс Hexagon class Hexagon { // Более интересные методы )
}
//
namespace MyShapes
using System: // Класс Square
class Stjaare { // Еще более интересные методы )
)
Если вам потребуется использовать эти классы внутри другого приложения, удобнее всего это сделать при помощи ключевого слова using:
// Используем обьекты. определенные в другом проетракстае имен
namespace MyApp
{
using System: using MyShapes;
class ShapeTester {
public static void MainO {
I/ Все эти объекты были определены в пространстве имен MyShapes Hexagon h = new Hexagon О: Circle с = new CiгсІєО; Square s - new SquareO:
j
)
!
136 Глава 2 • Основы языка С#
Применение пространств имен для разрешения конфликтов между именами классов
Пространства имен могут быть использованы для разрешения конфликтов между именами объектов в тех ситуациях, когда в нашем приложении используются разные объекты с одинаковыми именами. Представим себе такую ситуацию: наш класс ShapeTester должен использовать новое пространство имен, которое называется My3DShapes. В этом пространстве имен определены три класса с теми же именами, но предназначенные для работы с трехмерными объектами:
// Еще одно пространство имен для геометрических фигур
inamespace My3DShapes
{
using System;
II Класс 3D Circle class Cirde{}
II Класс 3D Hexagon class Hexagon{}
Il Класс 30 Square class Square{}
}
Если вы измените класс Sh.apeTesier как показано ниже, результатом станут три ошибки компилятора, сообщающие о конфликте имен:
// В коде есть двусмысленности!
namespace MyApp
{
using System: using MyShapes; using My3DShapes:
Предыдущая << 1 .. 55 56 57 58 59 60 < 61 > 62 63 64 65 66 67 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100