#c_sharp #net
Добрый день! Столкнулся с интересным феноменом, ответ на который я не смог найти. Как вы знаете, в рамках класса или структуры мы можем определить вложенный тип, который имеет доступ к скрытым членам вмещающего типа. И часто встречаю вложенные типы, которые предоставляют доступ к некому набору скрытых членов. Например в классе LinkedList поставляемого с .Net, интерфейс IEnumerator реализует вложенный тип структуры. https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic/LinkedList.cs И с таким я встречаюсь очень часто. Меня интересует, почему именно структура а не класс? В случае с LinkedList для себя я пока, что отвечаю так: "Это нужно для копирование энумератора и возможно это как-то связанно с потоко безопасностью". Но вот например в Unity, мы имеем дело с чем-то похожим, только там не имеет смысла копирование экземпляра хранимой структуры так, как при работе с ней, мы просто получаем некий адаптер который связывается с экземпляром класса. Вот свойство которое возвращает экземпляр структуры MainModule, изменение которой ведёт к изменение скрытых членов ParticleSystem - https://docs.unity3d.com/ScriptReference/ParticleSystem-main.html var ps = GetComponent(); ParticleSystem.MainModule main = ps.main; main.duration = 10; var mainCopy = main; mainCopy.duration = 15; данный код изменит длительность системы партиклов на 15. При этом тип MainModule - структура Подобный подход связан с практиками ООП? DDD? Или с чем-то ещё?
Ответы
Ответ 1
Очень просто: это такая низкоуровневая микрооптимизация. Дело в том, что классы наподобие LinkedList используются в миллионах различных проектов, и поэтому они должны быть очень эффективными. Если объявить энумератор как структуру, то его использование не требует аллокации памяти в куче, поэтому он на маленький процент эффективнее, чем если бы было объявление как класса, т. к. создаёт меньше нагрузки на сборщик мусора. Подобная экстремальная оптимизация в нормальных программах не нужна, поэтому в обычном, повседневном коде применять её не стоит.
Комментариев нет:
Отправить комментарий