← Назад к вопросам

Назови пример значимого типа

1.2 Junior🔥 251 комментариев
#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример значимого типа в C#

В C# к значимым типам (value types) относятся структуры, перечисления и примитивные типы данных. Классическим и наиболее часто используемым примером является тип int (System.Int32).

Характеристики значимого типа int

  • Хранение в стеке: Экземпляры int обычно размещаются в стеке вызовов, что обеспечивает высокую скорость выделения и освобождения памяти.
  • Копирование по значению: При присваивании одной переменной int другой или передаче в метод по значению создается полная копия данных.
  • Не может быть null: По умолчанию значимые типы не допускают значение null (до появления nullable value types в C# 2.0 и выше).
  • Наследование от System.ValueType: Все значимые типы неявно наследуются от класса System.ValueType, который переопределяет поведение методов из System.Object.

Практический пример

using System;

class Program
{
    static void Main()
    {
        // Пример 1: Копирование по значению
        int originalNumber = 42;
        int copiedNumber = originalNumber; // Создается ПОЛНАЯ КОПИЯ значения 42

        copiedNumber = 100; // Изменяется только копия

        Console.WriteLine($"originalNumber: {originalNumber}"); // Вывод: 42
        Console.WriteLine($"copiedNumber: {copiedNumber}");     // Вывод: 100
        // Изменение copiedNumber не затронуло originalNumber

        // Пример 2: Передача в метод по значению
        int valueForMethod = 10;
        Console.WriteLine($"До метода: {valueForMethod}"); // Вывод: 10
        ModifyValue(valueForMethod);
        Console.WriteLine($"После метода: {valueForMethod}"); // Вывод: 10 (не изменилось!)

        // Пример 3: Nullable значимый тип (с C# 2.0)
        int? nullableInt = null; // Теперь может хранить null
        nullableInt = 5;
        Console.WriteLine($"nullableInt: {nullableInt}");
    }

    static void ModifyValue(int number) // Параметр получает КОПИЮ значения
    {
        number = 999; // Изменяется только локальная копия
        Console.WriteLine($"Внутри метода: {number}"); // Вывод: 999
    }
}

Другие распространенные значимые типы

Помимо int, в C# существует множество встроенных значимых типов:

  • Целочисленные: byte, short, long, sbyte, ushort, uint, ulong
  • С плавающей точкой: float, double, decimal
  • Логический: bool
  • Символьный: char
  • Структуры: DateTime, TimeSpan, Guid
  • Пользовательские структуры: Разработчик может создавать свои значимые типы с помощью ключевого слова struct.
// Пример пользовательской структуры (значимый тип)
public struct Point
{
    public int X;
    public int Y;

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// Использование
Point p1 = new Point(10, 20);
Point p2 = p1; // Копирование по значению всего содержимого структуры
p2.X = 100; // p1.X останется равным 10

Ключевое отличие от ссылочных типов

Чтобы понять важность значимых типов, нужно противопоставить их ссылочным типам (reference types), таким как class, string, массивы:

// Сравнение
int valueType = 5;          // Значение 5 хранится прямо в переменной
int[] referenceType = new int[] { 5 }; // Переменная хранит ССЫЛКУ на массив в куче

int copyValue = valueType;          // Копируется число 5
int[] copyReference = referenceType; // Копируется только ссылка (адрес)

copyValue = 10;    // Не влияет на valueType
copyReference[0] = 10; // Меняет данные по исходной ссылке! referenceType[0] теперь тоже 10

Когда использовать значимые типы

Значимые типы оптимальны для:

  • Небольших данных (обычно до 16-24 байт)
  • Логически неделимых значений (координата, денежная сумма)
  • Сценариев, где критична производительность и нужно избегать выделения памяти в куче
  • Данных, которые часто копируются и где необходимо гарантировать, что исходные данные не изменятся случайно

Важное замечание о производительности

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

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