В основе применения языка программирования C# лежит работа с типами данных.
Все типы данных, которые используются в C#, перечислены на сайте Майкрософт.
В C# существуют различные типы данных, которые вы можете использовать для объявления переменных и представления различных типов данных. Вот некоторые часто используемые типы данных в C#:
1. Числовые типы:
– `int`: представляет целые числа со знаком.
– `float`: представляет числа с плавающей запятой одинарной точности (32 бита в памяти).
– `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[]`: представляет массив строк.
На этом пока это всё.
Каждый ссылочный тип данных мы рассмотрим в отдельных статьях более подробно, поскольку информация о некоторых из них требует отдельного внимания в силу своей объёмности.
2 комментария
Оставить комментарий