You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity环境下C#8.0中Stat类支持int/float参数构造的实现

解决方案

核心思路是通过静态工厂方法或隐式类型转换,在不使用多构造函数的前提下,让Stat类支持int和float两种参数输入,同时保证能统一存入Dictionary<string, Stat>集合。

方案一:静态工厂方法(语义清晰,推荐)

通过静态方法封装实例创建逻辑,避免暴露多个构造函数,同时明确区分不同类型的输入:

public class Stat
{
    // 用float统一存储数值,兼顾int和float的精度需求
    private float _baseValue;
    // 升级相关字段,可按需调整
    private int _currentLevel;
    private float _growthRate;

    // 唯一私有构造函数,外部只能通过工厂方法创建实例
    private Stat(float baseValue)
    {
        _baseValue = baseValue;
        _currentLevel = 1;
        _growthRate = 0.1f; // 默认成长率
    }

    // 创建int类型的Stat实例
    public static Stat FromInt(int value)
    {
        return new Stat(value);
    }

    // 创建float类型的Stat实例
    public static Stat FromFloat(float value)
    {
        return new Stat(value);
    }

    // 升级统计算法
    public void Upgrade()
    {
        _currentLevel++;
        _baseValue *= (1 + _growthRate);
        // 可扩展自定义逻辑:比如等级上限、成长衰减等
    }

    // 重置统计算法
    public void Reset(float initialValue)
    {
        _currentLevel = 1;
        _baseValue = initialValue;
        // 重置其他关联状态
    }

    // 获取当前统计值
    public float GetCurrentValue()
    {
        return _baseValue;
    }
}

初始化字典的写法:

var stats = new Dictionary<string, Stat>
{
    {"health", Stat.FromInt(30)},
    {"attack", Stat.FromFloat(2.5f)}
};

方案二:隐式类型转换(写法更简洁)

通过添加隐式转换规则,让int/float可以直接赋值给Stat类型,写法更接近你的预期:

public class Stat
{
    private float _baseValue;
    private int _currentLevel;
    private float _growthRate;

    // 唯一构造函数,接收float类型参数
    public Stat(float baseValue)
    {
        _baseValue = baseValue;
        _currentLevel = 1;
        _growthRate = 0.1f;
    }

    // 隐式转换:int自动转为Stat
    public static implicit operator Stat(int value)
    {
        return new Stat(value);
    }

    // 隐式转换:float自动转为Stat
    public static implicit operator Stat(float value)
    {
        return new Stat(value);
    }

    // 升级方法
    public void Upgrade()
    {
        _currentLevel++;
        _baseValue *= (1 + _growthRate);
    }

    // 重置方法
    public void Reset(float initialValue)
    {
        _currentLevel = 1;
        _baseValue = initialValue;
    }

    public float GetCurrentValue()
    {
        return _baseValue;
    }
}

初始化字典的写法:

var stats = new Dictionary<string, Stat>
{
    {"health", 30},    // 自动转换为Stat实例
    {"attack", 2.5f}   // 自动转换为Stat实例
};

性能说明

两种方案都能保障性能:

  • 实例创建均为直接内存分配,无额外开销
  • Dictionary存储引用类型,查找、访问效率与普通字典一致
  • 内部用float统一存储数值,避免了频繁类型转换的消耗,同时兼容两种输入类型

内容的提问来源于stack exchange,提问作者Caino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:25:25