2016-07-02 6 views
0

У меня есть класс под названием «RelativeData», который используется для сравнения значений через конечный автомат. Я пытаюсь создать класс, который принимает моментальные снимки данных с заданными интервалами. Интервалы: StateBegins, StateMachineBegins и тот, с которым у меня возникает проблема, liveValue. Задача im having - liveValue (s), которые я хочу отслеживать, находится в отдельном классе. Существует большой список значений, которые я хочу добавить в трек с моими объектами RelativeData, поэтому мой класс должен быть общим.C# Сохранение общей ссылки для самообновления снимков

Цель этого класса - делать снимки данных.

class RelativeData<T> 
{ 
    T initialValue; 
    T stateValue; 
    T liveValue; //currently not implemented, since i can't store a ref 

    public void StateMachineActive(T curValue) 
    { 
    initialValue = curValue; 
    } 
    public void StateUpdated(T curValue) 
    { 
     stateValue = curValue; 
    } 
} 

бывший) а float называется "энергия", которая принадлежит к заклинанию. Когда состояние машина активирует, он вызывает StateMachineActive в моем списке relativeData, который предпочтительно может внутренне обновление с помощью liveValue, вместо того, чтобы пройти curValue

Текущее исправление) У меня есть менеджер, который добавляет эти значения в словари родового типы.
Dictionary<myKey,relativeData<bool>> relativeBoolData
Dictionary<myKey,relativeData<float>> relativeFloatData
& и т.д ... Однако назвать StateUpdated, мне нужно, чтобы передать текущее значение, которое мне нужно, чтобы получить от большого коммутатора при помощи MYKEY. Doable, но в C++ я мог просто хранить T *. Невозможно включить небезопасный режим, поскольку Unity, похоже, не позволяет этого. Я мог бы иметь фактические значения, только что хранящиеся там, но тогда каждый раз, когда я хочу получить currentValue (который происходит чаще, чем получение относительного значения) во всем коде, это увеличит сложность (будьте более интенсивными). По крайней мере, я предполагаю.

Вопрос: 1) Могу ли я хранить указатель на Icomparable тип? Могу ли я иметь значение liveValue для типа valueType/Primitive data (т. Е. Int, long, enum) в другом месте, как я мог в C++ с T *. Я знаю, что могу передать «ref», но я не могу его сохранить.

2) Должен ли я просто сохранить фактические значения там вместо этого, и все будет восстановлено с помощью двухуровневого коммутационного футляра (Сначала, чтобы узнать, какой dict для вызова, float, bool ... и затем извлечь значение), это не слишком сильно увеличивает время выполнения? Неориентированные значения: энергия, стабильность и т. Д. Используются непрерывно в заклинаниях для внутренних расчетов. Относительный используется только для конечного автомата. (может иметь сразу 2 ~ 60 заклинаний)

3) Является ли это всего лишь плохим шаблоном, есть ли лучший образец, который я просто не вижу, лучший способ сделать снимки общих данных?

4) Я знаю, что массивы по ref, но это будет означать, что мои исходные данные должны были стать массивами правильно?

5) Должен ли я просто оставить это так, как есть. Он работает, чуть-чуть грязнее и медленнее.

все они IComparable: Ints, поплавки, BOOLS, перечислений ..

ответ

0

Вы можете выполнить одно из следующих действий:

  • Создание класса-оболочки для значений и сохранить ссылку на обертка.

    public class Wrapper<T> 
    { 
        public T Value { get; set; } 
    } 
    
  • Сохраните значения в массиве и запомните индексы вместо самих значений.
  • Сохраните значения в словаре и запомните их ключи вместо самих значений.
  • Храните делегата-ассистента (Func<T>). Примечание. Лямбда-выражения автоматически сохраняют ссылку на контекст, в котором они были впервые объявлены. См. The Beauty of Closures (Джон Скит).