Самый эффективный способ установить все поля класса в значение по умолчанию
Я пытаюсь создать структуру пула объектов. Каждый раз, когда клиент запрашивает объекты какого-либо типа, я возвращаю объект из кэша (очереди) или создаю новый объект, если в кэше его нет.
Теперь, когда клиентский код завершен с объектом, передает его в структуру для повторного кэширования. Но для того, чтобы этот шаблон работал, объект должен быть сброшен в исходное состояние. каждое поле должно быть установлено в default(T)
, Делать это вручную для каждого класса было бы ошибкой и утомительной работой.
public void Reset(){
x=0;
y=0;
...
}
И, конечно же, производительность является главной задачей. Я ищу наиболее эффективное решение.
РЕДАКТИРОВАТЬ:
Что касается мотивации, то это игровой проект unity3d, а сборка мусора - огромная проблема в unity. Каждый байт, который вы спасаете от сборки мусора, имеет значение. Поэтому желательно кэшировать объекты в отличие от самого быстрого, простого и разумного способа просто создавать новые объекты.
2 ответа
Идея состоит в том, чтобы ваш пул требовал, чтобы все объекты пула были IPoolObject. Этот интерфейс будет содержать метод Reset.
Затем каждый раз, когда выполняется вызов для извлечения элемента, этот метод Reset вызывается из инфраструктуры пула. Если ничего не делать, метод остается пустым.
Таким образом, любой заданный объект пула может быть сброшен по-своему, а также может сбросить другие компоненты, прикрепленные к объекту.
Вы можете найти мою версию объекта пула там: https://github.com/fafase/unity-utilities/blob/master/Scripts/ObjectPool.cs
Как насчет этого?
public void Reset()
{
foreach(FieldInfo fieldInfo in this.GetType().GetFields())
fieldInfo.SetValue(default(fieldInfo.GetType());
}