Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Типы данных в си шарп

Типы данных

Типы данных имеют особенное значение в C#, поскольку это строго типизированный язык. Это означает, что все операции подвергаются строгому контролю со стороны компилятора на соответствие типов, причем недопустимые операции не компилируются. Следовательно, строгий контроль типов позволяет исключить ошибки и повысить надежность программ. Для обеспечения контроля типов все переменные, выражения и значения должны принадлежать к определенному типу. Такого понятия, как «бестиповая» переменная, в данном языке программирования вообще не существует. Более того, тип значения определяет те операции, которые разрешается выполнять над ним. Операция, разрешенная для одного типа данных, может оказаться недопустимой для другого.

В C# имеются две общие категории встроенных типов данных: типы значений и ссылочные типы. Они отличаются по содержимому переменной. Концептуально разница между ними состоит в том, что тип значения (value type) хранит данные непосредственно, в то время как ссылочный тип (reference type) хранит ссылку на значение.

Эти типы сохраняются в разных местах памяти: типы значений сохраняются в области, известной как стек, а ссылочные типы — в области, называемой управляемой кучей.

Давайте разберем типы значений.

Целочисленные типы

В C# определены девять целочисленных типов: char, byte, sbyte, short, ushort, int, uint, long и ulong. Но тип char применяется, главным образом, для представления символов и поэтому рассматривается отдельно. Остальные восемь целочисленных типов предназначены для числовых расчетов. Ниже представлены их диапазон представления чисел и разрядность в битах:

Целочисленные типы C#

ТипТип CTSРазрядность в битахДиапазон
byteSystem.Byte80:255
sbyteSystem.SByte8-128:127
shortSystem.Int1616-32768 : 32767
ushortSystem.UInt16160 : 65535
intSystem.Int3232-2147483648 : 2147483647
uintSystem.UInt32320 : 4294967295
longSystem.Int6464-9223372036854775808 : 9223372036854775807
ulongSystem.UInt64640 : 18446744073709551615

Как следует из приведенной выше таблицы, в C# определены оба варианта различных целочисленных типов: со знаком и без знака. Целочисленные типы со знаком отличаются от аналогичных типов без знака способом интерпретации старшего разряда целого числа. Так, если в программе указано целочисленное значение со знаком, то компилятор C# сгенерирует код, в котором старший разряд целого числа используется в качестве флага знака. Число считается положительным, если флаг знака равен 0, и отрицательным, если он равен 1.

Отрицательные числа практически всегда представляются методом дополнения до двух, в соответствии с которым все двоичные разряды отрицательного числа сначала инвертируются, а затем к этому числу добавляется 1.

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

Так, если значение нужно сохранить без знака, то для него можно выбрать тип uint, для больших значений со знаком — тип long, а для больших значений без знака — тип ulong. В качестве примера ниже приведена программа, вычисляющая расстояние от Земли до Солнца в сантиметрах. Для хранения столь большого значения в ней используется переменная типа long:

Всем целочисленным переменным значения могут присваиваться в десятичной или шестнадцатеричной системе обозначений. В последнем случае требуется префикс 0x:

Если возникает какая-то неопределенность относительно того, имеет ли целое значение тип int, uint, long или ulong, то по умолчанию принимается int. Чтобы явно специфицировать, какой другой целочисленный тип должно иметь значение, к числу можно добавлять следующие символы:

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

Типы с плавающей точкой

Типы с плавающей точкой позволяют представлять числа с дробной частью. В C# имеются две разновидности типов данных с плавающей точкой: float и double. Они представляют числовые значения с одинарной и двойной точностью соответственно. Так, разрядность типа float составляет 32 бита, что приближенно соответствует диапазону представления чисел от 5E-45 до 3,4E+38. А разрядность типа double составляет 64 бита, что приближенно соответствует диапазону представления чисел от 5E-324 до 1,7Е+308.

Тип данных float предназначен для меньших значений с плавающей точкой, для которых требуется меньшая точность. Тип данных double больше, чем float, и предлагает более высокую степень точности (15 разрядов).

Если нецелочисленное значение жестко кодируется в исходном тексте (например, 12.3), то обычно компилятор предполагает, что подразумевается значение типа double. Если значение необходимо специфицировать как float, потребуется добавить к нему символ F (или f):

Десятичный тип данных

Для представления чисел с плавающей точкой высокой точности предусмотрен также десятичный тип decimal, который предназначен для применения в финансовых расчетах. Этот тип имеет разрядность 128 бит для представления числовых значений в пределах от 1Е-28 до 7,9Е+28. Вам, вероятно, известно, что для обычных арифметических вычислений с плавающей точкой характерны ошибки округления десятичных значений. Эти ошибки исключаются при использовании типа decimal, который позволяет представить числа с точностью до 28 (а иногда и 29) десятичных разрядов. Благодаря тому что этот тип данных способен представлять десятичные значения без ошибок округления, он особенно удобен для расчетов, связанных с финансами:

Результатом работы данной программы будет:

Символы

В C# символы представлены не 8-разрядным кодом, как во многих других языках программирования, например С++, а 16-разрядным кодом, который называется юникодом (Unicode). В юникоде набор символов представлен настолько широко, что он охватывает символы практически из всех естественных языков на свете. Если для многих естественных языков, в том числе английского, французского и немецкого, характерны относительно небольшие алфавиты, то в ряде других языков, например китайском, употребляются довольно обширные наборы символов, которые нельзя представить 8-разрядным кодом. Для преодоления этого ограничения в C# определен тип char, представляющий 16-разрядные значения без знака в пределах от 0 до 65 535. При этом стандартный набор символов в 8-разрядном коде ASCII является подмножеством юникода в пределах от 0 до 127. Следовательно, символы в коде ASCII по-прежнему остаются действительными в C#.

Читать еще:  Остаток от деления си шарп

Для того чтобы присвоить значение символьной переменной, достаточно заключить это значение (т.е. символ) в одинарные кавычки:

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

Наравне с представлением char как символьных литералов, их можно представлять как 4-разрядные шестнадцатеричные значения Unicode (например, ‘u0041’), целочисленные значения с приведением (например, (char) 65) или же шестнадцатеричные значения (например, ‘x0041’). Кроме того, они могут быть представлены в виде управляющих последовательностей.

Логический тип данных

Тип bool представляет два логических значения: «истина» и «ложь». Эти логические значения обозначаются в C# зарезервированными словами true и false соответственно. Следовательно, переменная или выражение типа bool будет принимать одно из этих логических значений. Кроме того, в C# не определено взаимное преобразование логических и целых значений. Например, 1 не преобразуется в значение true, а 0 — в значение false.

Обучение C#

Формула программиста

Работая с этим сайтом, Вы даете согласие на использование файлов Cookie.

Типы данных

Тип данныхПсевдоним
.NET Framework
Размер, байтДиапазон
byteSystem.Byte1-128. 127
sbyteSystem.SByte10. 255
shortSystem.Int162-32768. 32767
ushortSystem.UInt1620. 65535
intSystem.Int3242 147 483 648 . 2 147 483 647
uintSystem.UInt3240 . 4 294 967 295
longSystem.Int648-9 223 372 036 854 775 808 .
9 223 372 036 854 775 807
ulongSystem.UInt6480 . 18 446 744 073 709 551 615
boolSystem.Boolean1True , False
floatSystem.Single4±1,5×10 −45 . ±3,4 × 10 38
doubleSystem.Double8±1,5×10 −45 . ±3,4 × 10 38
decimalSystem.Decimal16±1,0×10 −28 . ±7,9 × 10 28
charSystem.Char2Символ Юникода
stringSystem.StringСтрока символов Юникода

Если переменная объявлена без инициализации, ей присваивается значение по умолчанию, равное 0.

Целочисленные данные

Все целочисленные данные имеют константные поля MaxValue и MinValue , содержание максимальное и минимальное значения, которые могут быть представлены данными соответствующего типа.

Логические данные

Логические данные представлены логическим типом bool . Несмотря на то, что данные логического типа могут принимать только одно из двух значений True или False , объем памяти, отводимый для хранения логических переменных составляет 1 байт.

Вещественные данные

Представление вещественного числа со знаком включает в себя целую часть, дробную часть и порядок числа.
По умолчанию все вещественные константы имеют тип double . Если последним символом константы указан суффикс f или F, константа имеет тип float . Если последним символом константы указан суффикс m или M, константа имеет тип decimal .
В силу особенностей представления вещественных чисел в разрядной сетке вычислительной машины, при работе с вещественными числами могут возникнуть проблемы, связанные с точностью их представления. Наименьшее целое вещественное число, которое может быть представлено в разрядной сетке float или double определяется константным полем Epsilon этих типов.
Тип decimal обладает более точным и узким диапазоном по сравнению с типами float и double , и поэтому больше подходит для использования в финансовых расчетах.

Символьные данные

Все символьные представления констант заключаются в апострофы » .

Строковые данные

Несмотря на то, что строковый тип данных не является простым, он является встроенным типом языка C#. Строковый тип данных string позволяет создавать строки любой длины, для инициализации которых используется последовательность символов, заключенная в кавычки «. » . Тип данных string также содержит ряд методов для обработки строковых данных.

Закрепить использование базовых типов данных Вы можете в разделе Типы данных курса Алгоритмика

Автор: Вставская Елена Владимировна

Начинаем практику по языку C#

Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.

Основатель проекта

Вебинары C#

+ Бесплатно, каждую субботу
+ Создание программ с нуля
+ Решение консольных задач

Видео-уроки

+ 300 практических видеоуроков
+ 400 интерактивных задач
+ Видео-решения и разбор

Миссия

Погружение в язык C#
Мотивация к изучению языка
Прокачка навыков программирования

ТИПЫ ДАННЫХ C#

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

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

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

Читать еще:  Цикл for примеры паскаль

Еще одна важная классификация типов — это их деление на значимые и ссылочные. Для значимых типов значение переменной (объекта) является неотъемлемой собственностью переменной (точнее, собственностью является память, отводимая значению, а само значение может изменяться). Для ссылочных типов значением служит ссылка на некоторый объект в памяти, расположенный обычно в динамической памяти — «куче».

Далее приведен перечень всех встроенных типов языка C# и их основные характеристики.

Имя типаСистемный типЗначенияРазмер
BoolSystem.Booleantrue, false8 бит

Арифметические целочисленные типы

Имя типаСистемный типДиапазонРазмер
SbyteSystem.SByte-128 — 127Знаковое, 8 Бит
ByteSystem.Byte0 — 255Беззнаковое, 8 Бит
ShortSystem.Short-32768 —32767Знаковое, 16 Бит
UshortSystem.UShort0 — 65535Беззнаковое, 16 Бит
IntSystem.Int32≈(-2*10^9 — 2*10^9)Знаковое, 32 Бит
UintSystem.UInt32≈(0 — 4*10^9)Беззнаковое, 32 Бит
LongSystem.Int64≈(-9*10^18 — 9*10^18)Знаковое, 64 Бит
UlongSystem.UInt64≈(0— 18*10^18)Беззнаковое, 64 Бит

Арифметический тип с плавающей точкой

Имя типаСистемный типДиапазонТочность
FloatSystem.Single+1.5*10^-45 — +3.4*10^387 цифр
DoubleSystem.Double+5.0*10^-324 — +1.7*10^30815-16 цифр

Арифметический тип с фиксированной точкой

Имя типаСистемный типДиапазонТочность
DecimalSystem.Decimal+1.0*10^-28 — +7.9*10^2828-29 значащих цифр
Имя типаСистемный типДиапазонТочность
CharSystem.CharU+0000 — U+ffff16 бит Unicode символ
StringSystem.StringСтрока из символов Unicode
Имя типаСистемный типПримечание
ObjectSystem.ObjectПрародитель всех встроенных и пользовательских типов

Рассмотрим пример объявления переменных и присваивания им значений:

int v = new Int32();

string s1 = «Agent»;

s1 = s1 + v.ToString() +x.ToString();

В этом примере переменная x объявляется как обычная переменная типа int. В то же время для объявления переменной v того же типа int используется стиль, принятый для объектов. В объявлении применяется конструкция new и вызов конструктора класса. В операторе присваивания, записанном в последней строке фрагмента, для обеих переменных вызывается метод ToString, как это делается при работе с объектами. Этот метод, наследуемый от родительского класса Object, переопределенный в классе int, возвращает строку с записью целого.

Рассмотрим еще один тип данных – структуру. Синтаксис объявления структуры аналогичен синтаксису объявления класса:

Все, что может быть вложено в тело класса, может быть вложено и в тело структуры: поля, методы, конструкторы и прочее, включая классы и интерфейсы. Аналогично классу, структура может иметь статические и не статические поля и методы, может иметь несколько конструкторов, в том числе статические и закрытые конструкторы. Для структур можно создавать собственные константы, используя поля с атрибутом readonly и статический конструктор. Структуры похожи на классы по своему описанию и ведут себя сходным образом, хотя и имеют существенные различия в семантике присваивания.

Но по сравнению с классами, структуры имеют существенные ограничения.

1) Самое серьезное ограничение связано с ограничением наследования, т.е. у структуры не может быть наследников, не может быть задан родительский класс или родительская структура.

2) Второе серьезное ограничение связано с процессом создания объектов. Пусть T — структура, и дано объявление без инициализации — T x. Это объявление корректно, в результате будет создан объект без явного вызова операции new. Сущности x будет отведена память, и на этой памяти будет развернут объект. Но поля объекта не будут инициализированы и, следовательно, не будут доступны для использования в вычислениях. Об этих особенностях подробно говорилось при рассмотрении значимых типов. В этом отношении все, что верно для типа int, верно и для всех структур.

Переменные C# | Типы и виды переменных

Опубликовано shwan в 28.11.2018 28.11.2018

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

Что такое переменная?

Определение переменной звучит примерно следующим образом:

Переменная – это именованная область памяти.

Но что это означает для нас. Давайте разбираться на примере.

Я думаю, что каждый из вас уже знаком с понятием переменной в алгебре. Это тот самый X, который приходиться искать в уравнении. В программировании переменная имеет схожие функции. Это своеобразный псевдоним, что-то неопределенное, неизвестное, под которым может скрываться кто угодно

Представь себе коробочку. На этой коробочке написано «Подарок» и это делает эту коробочку уникальной. Ты всегда сможешь найти именно эту коробку по этому имени (при условии, что не может существовать ни одной другой коробочки с таким именем).

А вот положить в эту коробочку ты можешь все что угодно. Это может быть и новенький IPhone, и миленький котеночек, и что-нибудь куда менее приятное (как в фильме «Семь»). Кстати, если не смотрел этот фильм, очень рекомендую, но только если у тебя крепкая психика и тебе больше 18 лет.

И в дальнейшем ты можешь как угодно работать с этой коробочкой. В любой момент ты можешь положить туда что-нибудь (предварительно выкинув оттуда то, что там лежало раньше), посмотреть, что там лежит, или вообще взять и выкинуть эту коробочку со всем содержимым.

При этом важно понимать, что концепция переменных это очень сложный механизм работы с памятью, который просто скрыт от программиста современными операционными системами и высокоуровневыми языками программирования.

Типизация переменных

Именно так работали бы переменные, если бы в не существовало типизации. Типизация – это возможность разделить коробочки по возможному содержимому. То есть, когда мы создаем коробочку, мы кроме имени указываем, что в ней может располагаться. И тогда, в коробочку для IPhone котеночка ты уже не засунешь.

Читать еще:  Как выучить паскаль с нуля самому

Это позволяет дополнительно защититься от ошибок, потому что ты будешь заранее знать, что будет в коробочке, и будешь готов к тому, как тебе нужно будет себя вести с содержимым.

Языки программирования условно можно разделить на два больших типа:

Сильнотипизированные – те, где вся ответственность за указание типа переменных ложится на программиста

Слаботипизированные – те, где компьютер сам решает, какой тип используется в конкретном случае.

Язык C# относится к первым. Возможно, это лишает его такой гибкости как тот же самый JavaScript (который относится ко вторым), но при этом дает большую защищенность от ошибок.

Виды переменных в языке C#

Перед тем, как мы приступим к знакомству с основными типами данных в языке C# необходимо узнать изучить еще один вопрос – виды переменных. На самом деле их всего два:

Ссылочные – хранятся в куче (сложные типы и классы)

Значимые – хранятся в стеке (базовые примитивные типы)

Мы не будем подробно останавливаться на этой теме, но общая идея следующая:

Условно в компьютере существует два вида памяти для работы приложения:

Стек (Stack) – быстрая память, но сильно ограниченная по размеру

Куча (Heap) – память, ограниченная только размером оперативки, но при этом значительно более медленная, чем стек.

Таким образом несложно понять, что стек хранит небольшие по размеру данные, к которым обеспечивается доступ с наибольшей скоростью, а в куче хранятся сложные сущности, содержащие большой объем данных.

Типы переменных в языке C#

Начнем со знакомства с наиболее часто используемыми типами данных (большинство их них значимые):

ИмяКлассОписаниеПример
intInt32Целое число со знаком-2147483648, -1, 0, 1, 2147483647
doubleDoubleЧисло с плавающей запятой-12.34, -1.1, 0, 1, 53.6123123
charCharСимвол‘a’, ‘b’, ‘1’, ‘+’, ‘t’, ‘_’
boolBooleanЛогическое значениеtrue, false
decimalDecimalЧисло с фиксированной запятой-123.2M, -1, 0, 1.10M
stringStringСтрока (ссылочный тип)“hello”, “a”, “11”, “+++”, “”
objectObjectБазовый класс (ссылочный тип)Вообще все в C#

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

ИмяКлассОписаниеПример
sbyteSByteМаленькое целое число со знаком

-128, -1, 0, 1, 127
byteByteМаленькое целое число без знака0, 1, 255
uintUInt32Целое число без знака0, 1, 4294967295
longInt64Большое целое число со знаком-9223372036854775808, -1, 0, 1, 9223372036854775807
ulongUInt64Большое беззнаковое целое число0, 1, 18446744073709551615
floatSingleМаленькое число с плавающей запятой-1.1F, 0, 1.001F

Надеюсь, ты заметил, что для типов float и decimal при дробном числе добавляется специальная литера (F и M соответственно). Это связано с тем, что по умолчанию в C# дробные числа хранятся в типе double, а это необходимо для того, чтобы компилятор правильно воспринимал эти числа. Для целых значений это не обязательно.

Объявление переменной в языке C#

Для того, чтобы объявить переменные следует указать ее тип и имя, и желательно сразу же инициализировать значением (но не обязательно). Соответственно, объявление целочисленной переменной будет выглядеть следующим образом:

Где int – тип, i – имя переменной, = — символ присваивания значения, 42 – значение, ; — символ окончания команды.

Данная форма является наиболее правильной, но в некоторых случаях возможно разделение данной операции на две команды

Аналогичным образом происходит объявление переменных и других типов.

Переменные типа var в языке C#

Тип var по своей сути является просто синтаксическим сахаром. Он позволяет не дублировать указание типа в объявлении переменных, получая данные о типе из контекста. Проще всего это понять на примере.

В данном случае компилятор и так может однозначно понять, что тип переменной должен быть целым числом, так как справа от = стоит целое число. Чтобы сэкономить силы программиста можно использовать тип var, который будет автоматически определять тип переменной из контекста, при этом она все также будет оставаться сильнотипизированой. То есть, если ты сначала объявишь переменную как целое число, а потом попробуешь добавить к ней строку, то получишь синтаксическую ошибку.

Переменные типа dynamic в C#

Я настоятельно рекомендую избегать использование данного типа на практике. Он делает переменные действительно не типизированными, снимая с компилятора вообще всю ответственность. Его внедрение связано с тем, что платформа .NET поддерживает множество языков, в том числе слаботипизированные, и для обеспечения совместимости и был создан этот тип.

В данном случае, компилятор на этапе написания не будет вообще контролировать типы, но естественно на этапе выполнения приложения вы получите сообщение об ошибке.

Я еще раз настоятельно рекомендую трижды подумать, перед тем как использовать этот тип, потом посоветоваться с опытными коллегами, а потом еще раз подумать, и только если не остается никакого другого варианта использовать этот тип.

Задание по теме переменные

Необходимо поэкспериментировать и объявить переменные всех типов данных. Вывести их на консоль. Изучить методы и свойства доступные для каждой переменной в помощнике intellisense.

Подписывайтесь на мой YouTube-канал, чтобы не пропускать живые уроки по программированию на языке C#, а также вступайте в мою группу Вконтакте и Telegram-канал. Там много обучающих материалов по всем языкам, а также отличный IT-юмор. А также рекомендую прочитать статью Монитор для программиста: как выбрать?

Ссылка на основную публикацию
Adblock
detector