Страницы

Поиск по вопросам

понедельник, 18 марта 2019 г.

Вложеный тип структуры для предоставления доступа к скрытым членам класса

Добрый день! Столкнулся с интересным феноменом, ответ на который я не смог найти.
Как вы знаете, в рамках класса или структуры мы можем определить вложенный тип, который имеет доступ к скрытым членам вмещающего типа. И часто встречаю вложенные типы, которые предоставляют доступ к некому набору скрытых членов. Например в классе 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? Или с чем-то ещё?


Ответ

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

Комментариев нет:

Отправить комментарий