Страницы

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

пятница, 24 января 2020 г.

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

#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 используются в миллионах различных проектов, и поэтому они должны быть очень эффективными. Если объявить энумератор как структуру, то его использование не требует аллокации памяти в куче, поэтому он на маленький процент эффективнее, чем если бы было объявление как класса, т. к. создаёт меньше нагрузки на сборщик мусора. Подобная экстремальная оптимизация в нормальных программах не нужна, поэтому в обычном, повседневном коде применять её не стоит.

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

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