// Value type (хранит значение непосредственно)
int number = 42; // Значение 42 хранится прямо в переменной
// Reference type (хранит ссылку на объект)
object obj = new object(); // Переменная содержит ссылку на объект в куче
// Value type - копирование значения
int a = 10;
int b = a; // Создается независимая копия
b = 20; // a остается 10
// Reference type - копирование ссылки
var list1 = new List<int> {1, 2, 3};
var list2 = list1; // Обе переменные ссылаются на один объект
list2.Add(4); // Изменения видны через list1
0, false и т.д.nullString - это reference type, но с некоторыми особенностями поведения value type:
Неизменяемость (immutable)
string s1 = "Hello";
string s2 = s1; // Копируется ссылка
s2 += " world"; // Создается НОВЫЙ объект, s1 не изменяется
Сравнение по значению
string a = "test";
string b = "test";
bool equal = (a == b); // true, хотя обычно у reference types сравниваются ссылки
Интернирование строк .NET сохраняет одну копию одинаковых строковых литералов:
string x = "abc";
string y = "abc";
bool sameRef = ReferenceEquals(x, y); // true в большинстве случаев
Хранение в памяти
Передача параметров:
void ModifyString(string s) { s += " modified"; }
string test = "original";
ModifyString(test);
// test останется "original", так как string immutable
Использование в структурах:
public struct Data
{
public string Description; // Reference type внутри value type
public int Value;
}
Основные различия между value и reference типами заключаются в способе хранения и передачи данных. String - особый reference type с value-семантикой, что делает его поведение интуитивно понятным, но важно помнить о его неизменяемой природе. Понимание этих различий критически важно для написания эффективного и корректного кода на C#.