> For the complete documentation index, see [llms.txt](https://topittop2.gitbook.io/topittop2/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://topittop2.gitbook.io/topittop2/c/tipy-dannykh-i-peremennye.md).

# Типы данных и переменные

Типы данных в C# определяют, какую информацию может хранить переменная, её размер и допустимые операции. C# — строго типизированный язык, поэтому тип переменной задаётся при её объявлении. В этом разделе мы разберём основные типы данных, их объявление и особенности, включая понятие `void`.

### Основные типы данных

C# делит типы данных на **значимые** (value types) и **ссылочные** (reference types). Значимые типы хранят данные напрямую, а ссылочные — ссылку на данные в памяти.

#### Значимые типы (Value Types)

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

* **Целые числа**:
  * `int` — 32-битное целое число (от -2,147,483,648 до 2,147,483,647).

    ```csharp
    int age = 25; // Объявление и инициализация переменной
    WriteLine(age); // Вывод: 25
    ```
  * `byte` — 8-битное целое без знака (0–255).
  * `short` — 16-битное целое (-32,768–32,767).
  * `long` — 64-битное целое (очень большие числа).
* **Числа с плавающей точкой**:
  * `float` — 32-битное число с плавающей точкой, требует суффикс `f`.

    ```csharp
    float temperature = 36.6f;
    WriteLine(temperature); // Вывод: 36.6
    ```
  * `double` — 64-битное число с плавающей точкой, более точное.
  * `decimal` — 128-битное число для финансовых вычислений, требует суффикс `m`.
* **Логический тип**:
  * `bool` — хранит `true` или `false`.

    ```csharp
    bool isStudent = true;
    WriteLine(isStudent); // Вывод: True
    ```
* **Символьный тип**:
  * `char` — один символ Unicode, задаётся в одинарных кавычках.

    ```csharp
    char grade = 'A';
    WriteLine(grade); // Вывод: A
    ```

#### Ссылочные типы (Reference Types)

Ссылочные типы хранят ссылку на данные. Если переменная не инициализирована, она равна `null`.

* **Строка**:
  * `string` — последовательность символов, задаётся в двойных кавычках.

    ```csharp
    string name = "Алексей";
    WriteLine(name); // Вывод: Алексей
    ```
* **Объект**:
  * `object` — базовый тип, от которого наследуются все остальные.

    ```csharp
    object anything = 42; // Может хранить любой тип
    WriteLine(anything); // Вывод: 42
    ```

#### Объявление переменных

Переменная объявляется с указанием типа и имени. Инициализация (присваивание значения) необязательна, но рекомендуется.

```csharp
using static System.Console;

class Program
{
    static void Main(string[] args)
    {
        int number = 10; // Объявление и инициализация
        double pi = 3.14;
        string greeting = "Привет, мир!";
        WriteLine($"{number}, {pi}, {greeting}");
        // Вывод: 10, 3.14, Привет, мир!
    }
}
```

#### Неявная типизация с `var`

Ключевое слово `var` позволяет компилятору самому определить тип переменной на основе присваиваемого значения. Используется только при инициализации.

```csharp
var count = 42; // Компилятор поймёт, что это int
var message = "Hello"; // Это string
WriteLine($"{count}, {message}"); // Вывод: 42, Hello
```

#### Почему `void` — не тип данных?

`void` используется в методах для указания, что метод **не возвращает значение**. Это не тип данных, а скорее индикатор отсутствия возвращаемого результата. Например:

```csharp
static void SayHello()
{
    WriteLine("Привет!");
}
```

Здесь `SayHello` не возвращает никаких данных, поэтому используется `void`. В отличие от типов вроде `int` или `string`, `void` нельзя использовать для объявления переменных.

#### Константы и неизменяемые переменные

* **`const`** — задаёт константу, значение которой нельзя изменить. Задаётся при компиляции.

  ```csharp
  const double Pi = 3.14159;
  // Pi = 3.14; // Ошибка: константу нельзя изменить
  ```
* **`readonly`** — переменная, которую можно задать только в конструкторе или при объявлении.

  ```csharp
  readonly int maxValue = 100;
  ```

### Полезные советы

* Выбирайте тип данных, подходящий по размеру и назначению (например, `byte` для маленьких чисел, `decimal` для денег).
* Используйте `var` для упрощения кода, но только если тип очевиден.
* Для методов, не возвращающих данные, используйте `void`.
