Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Категории типов




В языке программирования C# типы данных подразделяются на три категории:

  • Значение
  • Ссылка
  • Указатель

К первой категории относятся участки памяти, распределенные под переменные и предназначенные для хранения значений этих переменных. Например, следующий код

int x = 5;

объявляет переменную - целую со знаком, размером 32 бита, с именем x и начальным значением, равным 5. Ниже приведена соответствующая этому объявлению диаграмма: (http://gaze tte.linux.ru.net/lg85/ortiz/misc/ortiz/intvar.png)

Обратите внимание на то, как число 5 размещено на диаграмме.

Переменные-ссылки содержат адреса объектов, размещенных в динамической памяти. Следующий код объявляет переменную с именем y, типа object и инициализирует ее с помощью оператора new. Таким образом она получает адрес экземпляра object, размещенного в динамической памяти (object -- это базовый класс для всех типов в C#, но об этом чуть ниже).

object y = new object();

Соотвтетствующаяљдиаграмма выглядит так: (http://g azette.linux.ru.net/lg85/ortiz/misc/ortiz/objectvar.png)

В данном случае мы видим, что "значением" переменной является адрес объекта, размещенного в динамической памяти.

А теперь посмотрим, что произойдет, если мы создадим две новых переменных и инициализируем их значениями исходных переменных. Пусть имеется следующий код:

int a = x;

object b = y;

Результат такого объявления показан ниже: (http://gaz ette.linux.ru.net/lg85/ortiz/misc/ortiz/copying.png).

Как и следовало ожидать, значение переменной x было скопировано в переменную a. Если изменить одну из этих переменных, то это никак не повлияет на другую. В случае переменных y и b оказывается так, что обе они ссылаются на один и тот же объект. Если изменить состояние объекта, используя переменную y, то эти изменения можно будет наблюдать используя переменную b, и наоборот.

Кроме того, переменные-ссылки могут иметь специальное значение null, которое подразумевает ссылку на несуществующий объект, в пустоту. Продолжим наш пример следующими строками:

y = null;

b = null;

Теперь переменные y и b больше не ссылаются на какой-либо объект: (http://gaz ette.linux.ru.net/lg85/ortiz/misc/ortiz/nullvar.png)

А сам объект становится "мусором". Как я уже упоминал ранее, в C# встроена поддержка "сборщика мусора", это означает, что система автоматически освобождает память, занимаемую такими "мертвыми" объектами. Другие языки, такие как C++ и Pascal, не поддерживают автоматическую "сборку мусора". Поэтому программисты, пишущие на этих языках, вынуждены явно освобождать блоки динамической памяти по мере необходимости. Недостатком такого способа управления памятью является возможность появления "утечек" памяти. Как показывает опыт -- управление памятью "вручную" слишком громоздко и является потенциальным источником ошибок. Вот почему многие современные языки программирования (такие как Java, Python, Scheme, Smalltalk) имеют встроенную в окружение времени исполнения поддержку автоматической "сборки мусора".

И наконец -- переменные-указатели. Они похожи на указатели в языках программирования C и C++. Очень важно понимать, что и переменные-ссылки и переменные-указатели, фактически, представляют собой адрес в памяти, но на этом их сходство заканчивается. Переменные-ссылки отслеживаются сборщиком "мусора", указатели -- нет. Переменные-указатели допускают выполнение арифметических операций над ними, ссылки -- нет. Бесконтрольное использование указателей в программе в принципе небезопасно, поэтому в языке C# допускается работать с только внутуказателямири unsafe (небезопасных) блоков (небезопасный код должен помечаться зарезервированным словом unsafe, например:

static unsafe void FastCopy (byte[] src, byte[] dst, int count)

{

// здесь допустимо использовать указатели

}

(кроме того, для компиляции такого модуля, компилятор должен вызываться с ключом --unsafe+ прим. перев.). Однако это тема для отдельной статьи и я не буду углубляться в нее сейчас.

 

 




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 244; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.