Ответ
Основные различия между class (ссылочный тип) и struct (значимый тип) в C#:
1. Расположение в памяти и поведение при копировании:
- Класс: Экземпляры размещаются в управляемой куче. При присваивании переменной копируется только ссылка на объект.
- Структура: Экземпляры обычно размещаются в стеке (или внутри родительского объекта). При присваивании копируется всё значение (полное клонирование данных).
2. Наследование:
- Класс: Поддерживает наследование (кроме
sealedклассов). - Структура: Не может быть базовой для других типов и не поддерживает наследование (но реализует интерфейсы). Все структуры неявно
sealed.
3. Значение по умолчанию и null:
- Класс: Значение по умолчанию —
null. - Структура: Не может быть
null(если не используетсяNullable<T>). При создании без конструктора все поля инициализируются своими значениями по умолчанию.
4. Конструкторы:
- Структура: Всегда имеет неявный конструктор без параметров, который обнуляет все поля. Вы не можете определить собственный конструктор без параметров в версиях до C# 10.
Когда что использовать:
-
Используйте
structдля:- Небольших, неизменяемых (или преимущественно неизменяемых) данных (менее 16 байт).
- Логических группировок простых типов (например, точка
Point, цветRGB). - Частого создания и удаления в критичных к производительности сценариях (меньше нагрузка на сборщик мусора).
-
Используйте
classдля:- Объектов с поведением (методами) и сложным состоянием.
- Данных, которые часто передаются по ссылке.
- Когда требуется наследование или полиморфизм.
Пример:
// Структура - значимый тип
public struct Point
{
public int X;
public int Y;
// Копируется по значению
}
// Класс - ссылочный тип
public class Person
{
public string Name;
// Копируется по ссылке
}
// Использование
Point p1 = new Point { X = 10, Y = 20 };
Point p2 = p1; // Создается ПОЛНАЯ копия данных
p2.X = 100; // p1.X останется 10
Person per1 = new Person { Name = "Alice" };
Person per2 = per1; // Копируется только ссылка
per2.Name = "Bob"; // per1.Name тоже станет "Bob" Ответ 18+ 🔞
Ну слушай, вот объясняю как для дебила, но ты не обижайся, а то я сам от этих отличий иногда ебалом ебануться могу. Короче, class и struct в C# — это как два разных мира, блядь.
Первый и главный пиздец — это где они живут и как себя ведут. Представь, class — это как твой друг, который сидит в баре. Ты говоришь «Вася в баре», и все понимают, где его искать. Это ссылка, сука. Когда ты пишешь Person per2 = per1;, ты не клонируешь Васю, ты просто даёшь ещё одному челу бумажку с адресом того же бара. И если этот второй придет и Васю по морде даст, то первый, который придет позже, увидит того же побитого Васю. Потому что ссылка одна, блядь.
А вот struct — это как если бы ты купил два одинаковых бутерброда. Один съел, второй остался целый. Полная копия, нахуй. Написал Point p2 = p1; — скопировал все байты, как есть. Теперь меняй p2.X сколько влезет, p1 об этом нихуя не узнает. Они уже разные сущности, как близнецы, которые разъехались в разные города.
Наследование — тут вообще смешно. Классы — это как нормальная семья: есть папа, есть сын, может быть дед, все друг от друга что-то переняли. А структуры — это как отшельники, блядь. Никаких родителей, никаких детей, все сами по себе, селфины и интерфейсы только. Все структуры неявно sealed, то есть «запечатаны, иди нахуй».
Значение по умолчанию — тоже прикол. Создал переменную класса, а там null. Пустота, вакуум, нихуя нет. А структура — она никогда не null (если специально не обернуть в Nullable). Создал — и там уже лежит всё, проинициализированное нулями, даже если ты нихуя не делал. Есть неявный конструктор без параметров, который всё зануляет. До C# 10 свой такой конструктор написать было нельзя вообще, представляешь? Дичь.
Так когда что юзать, чтобы не выстрелить себе в ногу?
struct — это для мелких, простых, желательно неизменяемых данных. Типа координаты точки, цвет в RGB, вектор. Размер маленький (в идеале до 16 байт), чтобы копирование не стоило как чугунный мост. И если ты их создаёшь и выбрасываешь миллионами — то да, в стеке они живут, сборщику мусора работы меньше, производительность может выиграть.
class — это уже для серьёзных объектов, с поведением, с методами, с состоянием, которое меняется. Или когда тебе нужно наследование, полиморфизм, вся эта объектно-ориентированная хуйня. Или когда объект большой и копировать его каждый раз — это просто жесть, проще ссылку кидать.
Вот смотри на примере, тут всё видно:
// Структура — значимый тип, как тот самый бутерброд
public struct Point
{
public int X;
public int Y;
// Копируется по значению, полностью
}
// Класс — ссылочный тип, как Вася в баре
public class Person
{
public string Name;
// Копируется только ссылка на того же Васю
}
// Использование
Point p1 = new Point { X = 10, Y = 20 };
Point p2 = p1; // Создается ПОЛНАЯ копия всех данных, новый бутерброд
p2.X = 100; // p1.X так и останется 10, они уже не связаны
Person per1 = new Person { Name = "Alice" };
Person per2 = per1; // Скопировали только бумажку с адресом, где сидит Alice
per2.Name = "Bob"; // per1.Name тоже станет "Bob", потому что это одна и та же Alice, которой просто имя поменяли, ёпта!
Вот и вся разница, если коротко. Выбирай с умом, а то потом будешь как Герасим — «Муму-муму», а тебе в ответ: «Затопил, блядь, сам и рыдай теперь».
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶