Главная » C# » Типы данных в Visual C# (Sharp)

0

Тип данных представляет собой способ для описания единицы данных с помощью метаописания. Существует несколько типов данных: int, long, short, single, double, string, enum, struct и т. д. В С# можно даже определять собственные типы данных. Типы данных лежат  в основе среды  CLR и обеспечивают типовую безасность программирования.

Обычные и ссылочные типы данных

Среда CLR  поддерживает две  категории типов данных:  обычные  (простые) типы и ссылочные типы. Основная разница между этими двумя категориями типов даых состоит в способе хранения информации каждого типа. Но деление на простые и ссылочные типы данных было введено сравнительно недавно, и для некоторых может быть проблемой разобраться с ними.

При исполнении приложения средой CLR поток исполняет инфраструктуру CLI (Common Language Infrastructure, инфраструктура универсального языка). Рассмоим понятие потока с помощью аналогии похода в торговый центр за покупками. Как отдельная личность вы можете покупать вещи независимо от других покупатей. Но каждый из этих покупателей, так же как и вы, является отдельной личнтью и делает свои покупки независимо от всех других покупателей. Подобным образом в компьютере (торговый центр) исполняется множество потоков (покупели), каждый из которых выполняет свои операции независимо от других потоков. В магазине вы можете по неосторожности столкнуться с другим покупателем, и тот может уронить свои вещи. В то время как CLR старается предотвратить такие прлемы, приложив достаточно усилий в своем коде, можно заставить другие потоки "уронить" свои вещи.

При исполнении потоку выделяется локальный  пул  памяти,  называемый  стеком, что можно сравнить с вашим бумажником, содержащим наличные и кредитные карточки.  Как покупатель  носит свой бумажник из одного магазина в другой, так и поток носит с собой свой стек при вызове разных методов. Вы можете оплатить свою покупку одним из двух основных способов: наличными или с помощью критной карточки. Но при расплате кредитной карточкой приходится пройти через дополнительные процедуры. Чтобы удостовериться в подлинности кредитной каочки или наличии на ней достаточных средств, терминал на месте продаж должен связаться с центральным сервером. Оплата наличными выполняется намного бысее, чем кредитной карточкой, т. к. здесь процесс проверки отсутствует.

Теперь допустим, что вы отправились за покупками вместе со своей женой. У вас один кредитный счет на двоих, но у каждого своя кредитная карточка, которая ссылается на этот счет. С наличными этого делать нельзя: разделить 500-рублевую купюру у вас не получится, и каждый из вас должен имеет часть общей суммы оельными купюрами.

Способ оплаты наличными и с помощью кредитных карточек аналогичен обычным и ссылочным типам. Наличные — это обычный тип, а кредитная карточка — это ссылочный тип. При исполнении среды CLR от одного вызова метода к другому переносится код, который является стеком, содержащим некое число переменных обычного типа. Переменные этого типа хранятся непосредственно в стеке подобно наличным в бумажнике. А переменные ссылочного типа хранятся в стеке в виде указателей на область памяти, содержащую требуемы данные, как кредитные карточки указывают на наличные, которые хранятся в каком-то другом месте. Оасть памяти, хранящей переменные, на которые ссылаются указатели, называется кучей (heap). Все эти понятия иллюстрируются на рис. 2.14.

Рис. 2.14. Стеки и их взаимодействие с кучей во время исполнения среды CLR

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

Иногда мы применяем обычные типы, а иногда — ссылочные, так же как и иногда расплачиваемся за покупки наличными, а иногда— кредитными  карточками. Обычно мы расплачиваемся кредитными карточками за дорогостоящие вещи, т. к. предпочитаем не носить с собой большие суммы наличными". Этот же принцип относится к обычным и ссылочным типам в том смысле, что мы не хотим хранить данные большого объема в стеке.

Зная разницу между стеком и кучей, вы автоматически поймете разницу между обычными и ссылочными типами, т. к. между ними существует прямая  взаимвязь. Обычные типы, как правило, хранятся в стеке, а содержимое ссылочных тов всегда находится в куче.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии