值类型和引用类型统一封装

发布时间 2023-12-11 15:53:01作者: mc宇少

最近在看UGF的源码的时候发现了一个有意思的东西:Variable

这个类将代码中的值类型做了一层封装,使之转换成引用类型,和引用类型一起管理,并可以使用引用池管理。这个类目前只应用在状态机切换的参数上。

Variable:

/// <summary>
	/// 变量。
	/// </summary>
	/// <typeparam name="T">变量类型。</typeparam>
	public abstract class Variable<T> : Variable
	{
//使用泛型存,但get和set的时候还是会有拆装箱 private T m_Value; /// <summary> /// 获取变量类型。 /// </summary> public override Type Type { get { return typeof(T); } } /// <summary> /// 获取或设置变量值。 /// </summary> public T Value { get { return m_Value; } set { m_Value = value; } } /// <summary> /// 初始化变量的新实例。 /// </summary> public Variable() { m_Value = default(T); } /// <summary> /// 获取变量值。 /// </summary> /// <returns>变量值。</returns> public override object GetValue() { return m_Value; } /// <summary> /// 设置变量值。 /// </summary> /// <param name="value">变量值。</param> public override void SetValue(object value) { m_Value = (T)value; } /// <summary> /// 清理变量值。 /// </summary> public override void Clear() { m_Value = default(T); } /// <summary> /// 获取变量字符串。 /// </summary> /// <returns>变量字符串。</returns> public override string ToString() { if (m_Value == null) { return "<Null>"; } return m_Value.ToString(); } }

  int32的实现:

/// <summary>
    /// System.Int32 变量类。
    /// </summary>
    public sealed class VarInt32 : Variable<int>
    {
        /// <summary>
        /// 初始化 System.Int32 变量类的新实例。
        /// </summary>
        public VarInt32()
        {
        }

        /// <summary>
        /// 从 System.Int32 到 System.Int32 变量类的隐式转换。
        /// </summary>
        /// <param name="value">值。</param>
        public static implicit operator VarInt32(int value)
        {
            VarInt32 varValue = ReferencePool.Acquire<VarInt32>();
            varValue.Value = value;
            return varValue;
        }

        /// <summary>
        /// 从 System.Int32 变量类到 System.Int32 的隐式转换。
        /// </summary>
        /// <param name="value">值。</param>
        public static implicit operator int(VarInt32 value)
        {
            return value.Value;
        }
    }

  

  使用:

procedureOwner.SetData<VarInt32>("UpdateResourceCount", m_UpdateResourceCount);
m_UpdateCount = procedureOwner.GetData<VarInt32>("UpdateResourceCount");