Часто мне нужно минимизировать распределение объектов в коде, который выполняется очень часто.
Конечно, я могу использовать обычные методы, такие как пул объектов, но иногда мне просто нужно что-то локально.
Чтобы попытаться достичь этого, я придумал следующее:
public static class Reusable<T> where T : new()
{
private static T _Internal;
private static Action<T> _ResetAction;
static Reusable()
{
_Internal = Activator.CreateInstance<T>();
}
public static void SetResetAction(Action<T> resetAction)
{
_ResetAction = resetAction;
}
public static T Get()
{
#if DEBUG
if (_ResetAction == null)
{
throw new InvalidOperationException("You must set the reset action first");
}
#endif
_ResetAction(_Internal);
return _Internal;
}
}
В настоящее время использование будет:
// In initialisation function somewhere
Reuseable<List<int>>.SetResetAction((l) => l.Clear());
....
// In loop
var list = Reuseable<List<int>>.Get();
// Do stuff with list
Что я хотел бы улучшить, так это тот факт, что все это не содержится в одном месте (.SetResetAction
отделено от того, где оно фактически используется).
Я бы хотел получить код примерно так:
// In loop
var list = Reuseable<List<int>>.Get((l) => l.Clear());
// Do stuff with list
Проблема в том, что я получаю распределение объектов (оно создает Action<T>
) каждый цикл.
Можно ли получить нужное мне использование без каких-либо выделений объектов?
Очевидно, я мог бы создать ReuseableList<T>
со встроенным Action
, но я хочу учесть другие случаи, когда действие может отличаться.