C#: Отличие класса от структуры (class vs struct)

Сегодня я решил рассказать о одном из частых вопросах на собеседованиях «чем отличается класс от структуры в C#«.

На самом деле ответить на этот вопрос можно очень коротко. Структура в C# является типом передающимся по значению, класс же является ссылочным типом. По большей части сказать больше нечего. Однако данный ответ врятли внесет какую то ясность людям, которые не понимают что значит передавать по ссылке или передавать по значению. Поэтому давайте рассмотрим данный вопрос подробней на примерах. Предположим что у нас есть «class cA» и struct «sA».
Первое важное отличие ссылочного типа от типа передаваемого по значению это то, что значимый тип не может быть равен null.

cA ca = null; //OK
sA sa = null; //Error

Так как структура не может быть равна null то она должна быть инициализирована. При этом инициализация структуры происходит по умолчанию нулевыми значениями. В следствие этого вы не можете создать конструктор по умолчанию для структур. А как следствие не можете инициализировать значения переменных в структурах inline.

struct sA {
    int c = 11; //Error
    bool b; //Ok
    int a; //Ok
    public sA() { } //Error
    public sA(int a, bool b) { } //Ok
}

sA sa = new sA();
sA sa2; ///Эквивалентно записи строчкой выше
//sa.b == sa2.b == false
//sa.a == sa2.a == 0

Но главным различаем данных двух конструкций является их поведение при присваивании. Это повередение очень легко рассмотреть на примере:

sA sa = new sA() { a = 1 };
cA ca = new cA() { a = 2 };
sA sa2 = sa;
sa2.a = 5;
Console.WriteLine("sa.a={0}, sa2.a={1}", sa.a, sa2.a); //sa.a=1, sa2.a=5
cA ca2 = ca;
ca2.a = 10;
Console.WriteLine("ca.a={0}, ca2.a={1}", ca.a, ca2.a); //ca.a=10, ca2.a=10


Данный пример очень наглядно демонстрирует различие между передачей значения по ссылки и по значению. Как видно передача по значению подрузомевает создание новой переменной и копирование в нее всех значений. Что в дальнейшем позволяет работать с двумя различными объектами. Передача же по ссылке подрузомевает создание новой ссылки на уже имеющиеся значения.
Если проводить аналогию, например, с Windows, то передача по значению — это копирование ваших файлов, а передача по ссылке — создание ярлыков.

Запись опубликована в рубрике C# с метками , , , , , , , , , . Добавьте в закладки постоянную ссылку.