C#: Типы данных

Spread the love

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

Все типы данных, которые используются в C#, перечислены на сайте Майкрософт.

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

1. Числовые типы:

   – `int`: представляет целые числа со знаком.

   – `float`: представляет числа с плавающей запятой одинарной точности (32 бита в памяти).

100000R, 12%, 1 year

   – `double`: представляет числа с плавающей запятой двойной точности (64 бита в памяти).

   – `decimal`: представляет десятичные числа с более высокой точностью.

   – `byte`: байт представляет собой целые числа без знака от 0 до 255.

   – `short`: представляет целые числа со знаком с меньшим диапазоном.

   – `long`: представляет целые числа со знаком с большим диапазоном.

2. Логический тип:

   – `bool`: представляет логическое значение (`true` или `false`).

3. Типы персонажей:

   – `char`: представляет собой один символ Юникода.

4. Строковый тип:

   – `string`: строка представляет собой последовательность символов.

5. Тип даты и времени:

   – `DateTime`: представляет даты и время.

6. Массивы:

   – `int[]`: представляет массив целых чисел.

   – `string[]`: представляет массив строк.

   – И так далее для других типов данных.

7. Перечисления:

   – `enum`: представляет набор именованных постоянных значений.

8. Другие типы:

   – `object`: представляет базовый тип, который может содержать любое значение.

   – `dynamic`: представляет тип, поведение которого определяется во время выполнения. Это всего лишь несколько примеров типов данных, доступных в C#. Каждый тип данных имеет определенные характеристики и сценарии использования. Важно выбрать подходящий тип данных в зависимости от того, какие данные вы хотите хранить или манипулировать ими в своей программе.

Все типы данных в C# можно также разделить на

  • ссылочные (Class)
  • значимые (Struct)

В C# “значимый тип” (struct) – это пользовательский тип данных, который представляет структуру, содержащую набор полей. В отличие от ссылочных типов (классов), значимые типы хранят свои значения непосредственно в стеке памяти, а не в куче.

Давайте отвлечёмся от рассмотрения темы значимых типов данных.

Рассмотрим важный вопрос, касаемый темы, о распределении памяти компьютера на две части: стек и куча.

Стек памяти (или стек вызовов) является одним из двух основных компонентов памяти в компьютере, используемых для управления вызовами функций и хранения локальных переменных. В C# стек памяти компьютера играет важную роль при выполнении программы.

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

Стек памяти работает по принципу “последний вошел – первый вышел” (LIFO, Last-In-First-Out). Это означает, что последняя функция, добавленная в стек памяти, будет первой, которая будет завершена и удалена из стека.

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

Важно отметить, что стек памяти имеет ограниченный размер – 1 МБ, и превышение этого размера может привести к ошибке переполнения стека (stack overflow). Поэтому важно обеспечить правильное использование стека памяти и избегать рекурсивных вызовов функций с глубокой вложенностью.

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

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

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

Основные особенности кучи:

1. Динамическое выделение: Память в куче выделяется динамически во время выполнения программы по мере необходимости.

2. Управление памятью: В языках программирования, таких как C# и Java, управление памятью в куче осуществляется автоматически сборщиком мусора. Сборщик мусора автоматически определяет, какие объекты больше не используются, и освобождает занятую ими память.

3. Объекты различных размеров: Куча может хранить объекты различных размеров, включая массивы и сложные структуры данных.

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

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

Вернёмся к рассмотрению темы значимых типов данных.

Итак, мы сказали ранее, что в отличие от ссылочных типов (классов), значимые типы хранят свои значения непосредственно в стеке памяти компьютера, а не в куче.

Вот некоторые особенности значимых типов (struct) в C#:

1. Значимые типы являются значимыми значениями: Значимые типы в C# являются значимыми значениями, что означает, что они копируются по значению при присваивании и передаче аргументов методам, а не по ссылке, как классы.

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

3. Память и производительность: Значимые типы хранятся в стеке памяти, что обычно более эффективно по сравнению с хранением в куче, так как имеет меньшие накладные расходы на сборку мусора. Они обычно занимают меньше места в памяти, чем эквивалентный класс.

4. Неизменяемость по умолчанию: По умолчанию поля значимых типов являются неизменяемыми (readonly). Это означает, что после создания значимого объекта, его поля не могут быть изменены.

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

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

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

К значимым типам данных относятся:

  • byte
  • int
  • short
  • float
  • double
  • bool
  • char
  • enum

byte: Тип данных byte представляет 8-битное целое число. представляет переменную, которую можно представлять в виде целых чисел без знака от 0 до 255. Он занимает 1 байт (8 бит) памяти.

`int`: представляет целые числа со знаком. Тип данных int представляет 32-битное целое число. Обычно он занимает 4 байта (32 бита) памяти.

`short`: представляет переменную, которую можно представлять в виде целых чисел до 32000 (сокращение от “short integer”). В C# тип данных “short” используется для хранения целых чисел в диапазоне от -32,768 до 32,767. Тип данных short представляет 16-битное целое число. Он занимает 2 байта (16 бит) памяти.

`float`: представляет числа с плавающей запятой одинарной точности.

`double`: представляет числа с плавающей запятой двойной точности (64 бита в памяти)

`bool`: представляет логическое значение (`true` или `false`)

`char`: представляет собой один символ Юникода

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

Перейдём к рассмотрению ссылочных типов данных.

В C# “ссылочный тип” (class) представляет пользовательский тип данных, который может содержать поля, свойства, методы и другие члены. В отличие от значимых типов (struct), ссылочные типы хранятся в куче памяти компьютера и передаются по ссылке.

Вот некоторые особенности ссылочных типов (class) в C#:

1. Ссылочная семантика: При присваивании ссылочного типа переменной, переменная хранит в куче ссылку на объект, а не сам объект. Это означает, что изменения, внесённые в объект через одну переменную, отразятся во всех других переменных, которые ссылаются на этот объект.

2. Динамическое выделение памяти: Объекты ссылочных типов создаются динамически во время выполнения программы с использованием оператора `new`. Они автоматически управляются сборщиком мусора, который освобождает память от неиспользуемых объектов.

3. Наследование и полиморфизм: Ссылочные типы могут быть наследованы от других классов, создавая иерархию наследования. Они поддерживают полиморфизм, что позволяет использовать одну переменную ссылочного типа для хранения разных объектов.

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

5. Классы могут быть модифицируемыми: Поля и свойства классов могут быть изменены после их создания. Методы классов могут изменять состояние объекта и выполнять различные операции.

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

Ссылочные типы (class) в C# используются для создания сложных объектов и моделирования более сложных структур данных. Они обеспечивают гибкость, наследование и полиморфизм, что позволяет создавать более масштабируемые и поддерживаемые программы.

В свою очередь ссылочные типы данных делятся на:

  • string – строка представляет собой последовательность символов
  • Generics – обобщения – мощная функция, которая позволяет вам определять классы, структуры, интерфейсы, методы и делегаты, которые могут работать с различными типами без их предварительного указания
  • массивы – представляет массив некоторых данных, например, `int[]`: представляет массив целых чисел, `string[]`: представляет массив строк.

На этом пока это всё.

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


Spread the love

Добавить комментарий