【问题标题】:c# Storing a generic reference to have self updating snapshotsc# 存储通用引用以具有自我更新的快照
【发布时间】:2016-07-02 13:27:42
【问题描述】:

我有一个名为“RelativeData”的类,用于通过状态机比较值。我正在尝试构建一个以给定间隔拍摄数据快照的类。间隔是:StateBegins、StateMachineBegins,以及我遇到的问题,liveValue。 我面临的挑战是我希望跟踪的 liveValue(s) 在一个单独的类中,我想添加大量值来跟踪我的 RelativeData 对象,所以我的类需要是通用的。

这个类的重点是拍摄数据的快照。

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;
   }
}

ex) 一个名为“能量”的float,属于一个法术。当状态机激活时,它会在我的 relativeData 列表中调用 StateMachineActive,它最好可以使用 liveValue 在内部更新,而不必传递 curValue

当前修复) 我有一个经理将这些值添加到泛型类型的字典中。
Dictionary&lt;myKey,relativeData&lt;bool&gt;&gt; relativeBoolData
Dictionary&lt;myKey,relativeData&lt;float&gt;&gt; relativeFloatData
& ETC... 但是要调用 StateUpdated,我需要传递当前值,我需要使用 myKey 从大型开关盒中获取该值。可行,但在 C++ 时代,我可以只存储一个 T*。无法打开不安全模式,因为 Unity 似乎不允许这样做。我可以将实际值存储在其中,但是每次我想在整个代码中的任何地方都获取 currentValue (这比获取相对值更频繁地发生)时,它会增加复杂性(更多的 proc 重)。至少我认为。

问题: 1) 我可以存储指向 Icomparable 类型的指针吗?我是否可以让 liveValue 指向其他地方的 valueType/Primitive 数据类型(即 int、long、enum),就像在 C++ 中使用 T* 一样。我知道我可以使用“ref”传递,但我似乎无法存储它。

2)我是否应该只将实际值存储在那里,并通过两层开关盒检索所有内容(首先知道要调用哪个字典,浮点数,布尔值......然后检索值)这不会过多地增加运行时间吗?非相对值:能量、稳定性等,在法术中持续用于内部计算。相对仅用于状态机。 (可能同时激活 2~60 个法术)

3) 这只是一个糟糕的模式吗,有没有更好的模式,我只是没有看到,更好的方法来获取通用数据的快照?

4) 我知道数组是 ref,但这意味着我的原始数据都必须变成数组,对吗?

5) 我应该保持原样吗?它可以工作,只是有点混乱和慢。

它们都是IComparable:整数、浮点数、布尔值、枚举......

【问题讨论】:

    标签: c# generics snapshot state-machine ref


    【解决方案1】:

    您可以执行以下操作之一:

    • 为值创建一个包装类并在包装上保留一个引用。

      public class Wrapper<T>
      {
          public T Value { get; set; }
      }
      
    • 将值存储在数组中并记住索引而不是值本身。
    • 将值存储在字典中并记住它们的键而不是值本身。
    • 存储访问者委托 (Func&lt;T&gt;)。注意: Lambda 表达式会自动保留对它们首次声明的上下文的引用。请参阅 The Beauty of Closures(作者 Jon Skeet)。

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      相关资源
      最近更新 更多