Всегда на интервью спрашиваю у ребят и девчат, приходилось ли им выбирать между struct или class на практике. И в каком случае стоит применять одно, а в каком другое. (Спрашиваю, потому что сам не ебу, если честно, что там и как.Ставь лайкосик 👍, если тоже на интервью пытаешься узнать что-то новое!)
Это тот самый случай, когда ты теорию знаешь, но на практике вообще не ясно, как эту теорию применить. Вот сегодня, кажется, что я сформулировал довольно крепкий кейс, в котором нужно как минимум задуматься, отдать предпочтение структуре или классу.
❓Так вот, представим себе вот такой объект. Ему нужно быть структурой или классом?
public ???? TimeInterval
{
public TimeSpan From { get; set; }
public TimeSpan To { get; set; }
}
📖 Я считаю, что эта штука может стать структурой и для этого есть вполне практичный аргумент. Безо всяких там (бито-байтоёбств) оптимизаций по памяти и прочей лабуды. Рассмотрим такой тест (если лень читать, то я там сравниваю два одинаковых по наполнению TimeInterval):
[Test]
public void StructRef()
{
var from = new TimeSpan();
var to = new TimeSpan().Add(30.Minutes());
var interval1 = new TimeInterval()
{
From=from,
To=to
};
var interval2 = new TimeInterval()
{
From=from,
To=to
};
Assert.True(interval1.Equals(interval2));
}Если мы сделали TimeInterval структурой, то он пройдет. Что и не удивительно, так как метод Equals проверит наши данные по значению.
Но если мы сделаем TimeInterval классом, то этот тест так просто уже не прокатит. Придется учинить оверрайдинг метода Equals для этого класса, а где оверрайдинг Equals, там и оверрайдинг GetHashCode.
🅰️ Теперь я приведу практический вывод, который вы можете использовать в повседневной разработке: Если вам в каком-то классе понадобилось переопределять Equals, то прежде чем это делать, задумайтесь, а не стоит ли вашему классу стать структурой?
Ну и еще нужно воспользоваться памяткой от Microsoft разумеется.
P.S.: Конечно тут можно использовать record struct а не просто struct. Надеюсь это очевидно)
#struct #class