English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# Уровень базовый

C# Уровень продвинутый

C# ООП (Объектно-ориентированное программирование)

Значимые типы и типы ссылок в C#

В C# данные типы классифицируются по способу хранения значений в памяти. C# включает следующие категории типов данных:

  1. Тип значения

  2. Ссылочные типы

  3. Тип указателя

Тип значения

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

Все значения типы происходят отSystem.ValueTypeДеривированный, аSystem.ValueTypeА затем изSystem.ObjectДеривированный.

Система хранит 100 в памяти, выделенной для переменной i. На следующем рисунке показано, как 100 хранится в одном из предполагаемых мест памяти

Ассигнование памяти переменным типа значения

Все следующие типы данных являются типами значений:

  • bool

  • byte

  • char

  • decimal

  • double

  • enum

  • float

  • int

  • long

  • sbyte

  • short

  • struct

  • uint

  • ulong

  • ushort

Передача переменных типа значения

  Когда вы передаете переменную типа значения из одного метода в другой, система создает отдельную копию переменной в другом методе. Если вы изменяете значение в одном методе, это не повлияет на переменную в другом методе.

static void ChangeValue(int x)
{
    x = 200;
    Console.WriteLine(x);
}
static void Main(string[] args)
{
    int i = 100;
    Console.WriteLine(i);
    
    ChangeValue(i);
    
    Console.WriteLine(i);
}
Вывод:

100
200
100

В примере выше, даже после того как переменная i в методе Main() передается в метод ChangeValue() и ее значение изменяется, она все еще остается неизменной.

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

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

Например, следующие переменные строк:

string s = "Hello World!!";

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

Ассигнование памяти ссылочным типам переменных

Как показано на рисунке, система выбирает случайное положение памяти для переменной s (0x803200). Значение переменной s равно 0x600000, это адрес памяти реального значения. Таким образом, ссылочные типы хранят адрес места хранения реального значения, а не значение само по себе.

Вот примеры типов данных ссылочного типа:

  • Строки

  • Массивы (даже если их элементы являются типами значений)

  • Классы

  • Делегаты

Передача переменных ссылочного типа

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

static void ChangeReferenceType(Student std2)
{
    std2.StudentName = "Steve";
}
static void Main(string[] args)
{
    Student std1 = new Student();
    std1.StudentName = "Bill";
    
    ChangeReferenceType(std1);
    Console.WriteLine(std1.StudentName);
}
Вывод:
Steve

В上面的 примере мы передаем объект Student std1 методу ChangeReferenceType(). Здесь он фактически передает адрес памяти std1. Поэтому, когда метод ChangeReferenceType() изменяет StudentName, он фактически изменяет StudentName объекта std1, так как std1 и std2 указывают на одно и то же адрес в памяти.

Значение null

  Значение по умолчанию null для переменных ссылочного типа - это неинициализированный. Null означает, что не указывается ни на какой объект.

Тип пустой ссылки

Переменные значимых типов не могут быть null, так как они сохраняют значения, а не адреса памяти. C# 2.0 ввел типы nullable, с помощью которых можно назначить null значению переменной значимого типа или声明 переменную значимого типа, не назначая ей значение.