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

如何实现支持运算符重载的C#自定义Int结构体/类(含最值与历史值)

实现支持常规算术运算符的自维护最值结构体

需要实现一个自定义结构体(或类),能够自动维护当前值、最小值、最大值和前一次的值,并且要像普通int一样支持赋值、+=、-=等常规运算符操作,例如:

var m = new stMetric();
m = 5;
m += 5;

当前的结构体实现了基础的状态维护逻辑,但缺少必要的运算符重载,导致无法支持+=这类复合赋值操作,同时显式转换的定义也限制了直接赋值m=5的便利性。

修正后的结构体实现

internal struct stMetric
{
    private int _value;
    private int? _valueMin;
    private int? _valueMax;
    private int? _valuePrev;

    // 无参构造函数,初始化默认状态
    public stMetric() { }

    // 从int初始化的构造函数
    public stMetric(int value)
    {
        _valuePrev = null;
        _value = value;
        _valueMin = value;
        _valueMax = value;
    }

    // 私有构造函数,用于运算符重载时复制状态
    private stMetric(int value, int? min, int? max, int? prev)
    {
        _value = value;
        _valueMin = min;
        _valueMax = max;
        _valuePrev = prev;
    }

    public int Value
    {
        get => _value;
        set => SetValue(value);
    }

    public readonly int Min => _valueMin ?? 0;
    public readonly int Max => _valueMax ?? 0;
    public readonly int Previous => _valuePrev ?? 0;

    public override string ToString() => Value.ToString();

    private void SetValue(int value)
    {
        _valuePrev = _value;
        _value = value;
        _valueMin = _valueMin.HasValue ? Math.Min(_valueMin.Value, value) : value;
        _valueMax = _valueMax.HasValue ? Math.Max(_valueMax.Value, value) : value;
    }

    // 隐式转换:stMetric -> int
    public static implicit operator int(stMetric v) => v.Value;

    // 隐式转换:int -> stMetric,支持直接赋值m=5
    public static implicit operator stMetric(int v) => new stMetric(v);

    // 重载加法运算符
    public static stMetric operator +(stMetric lhs, int rhs)
    {
        var newValue = lhs.Value + rhs;
        var newMin = lhs._valueMin.HasValue ? Math.Min(lhs._valueMin.Value, newValue) : newValue;
        var newMax = lhs._valueMax.HasValue ? Math.Max(lhs._valueMax.Value, newValue) : newValue;
        return new stMetric(newValue, newMin, newMax, lhs._value);
    }

    // 重载减法运算符
    public static stMetric operator -(stMetric lhs, int rhs)
    {
        var newValue = lhs.Value - rhs;
        var newMin = lhs._valueMin.HasValue ? Math.Min(lhs._valueMin.Value, newValue) : newValue;
        var newMax = lhs._valueMax.HasValue ? Math.Max(lhs._valueMax.Value, newValue) : newValue;
        return new stMetric(newValue, newMin, newMax, lhs._value);
    }

    // 重载乘法运算符
    public static stMetric operator *(stMetric lhs, int rhs)
    {
        var newValue = lhs.Value * rhs;
        var newMin = lhs._valueMin.HasValue ? Math.Min(lhs._valueMin.Value, newValue) : newValue;
        var newMax = lhs._valueMax.HasValue ? Math.Max(lhs._valueMax.Value, newValue) : newValue;
        return new stMetric(newValue, newMin, newMax, lhs._value);
    }

    // 重载除法运算符(整数除法)
    public static stMetric operator /(stMetric lhs, int rhs)
    {
        var newValue = lhs.Value / rhs;
        var newMin = lhs._valueMin.HasValue ? Math.Min(lhs._valueMin.Value, newValue) : newValue;
        var newMax = lhs._valueMax.HasValue ? Math.Max(lhs._valueMax.Value, newValue) : newValue;
        return new stMetric(newValue, newMin, newMax, lhs._value);
    }

    // 重载自增运算符(前缀)
    public static stMetric operator ++(stMetric value)
    {
        return value + 1;
    }

    // 重载自减运算符(前缀)
    public static stMetric operator --(stMetric value)
    {
        return value - 1;
    }

    // 重载复合赋值运算符(可选,编译器会自动用对应二元运算符实现,自定义可优化逻辑)
    public static stMetric operator +=(stMetric lhs, int rhs)
    {
        return lhs + rhs;
    }

    public static stMetric operator -=(stMetric lhs, int rhs)
    {
        return lhs - rhs;
    }
}

关键修改说明

  • 隐式转换调整:将int转stMetric的转换改为隐式,支持直接m=5这类赋值操作。
  • 私有构造函数:用于在运算符运算时复制原有实例的min、max状态,避免历史最值丢失。
  • 运算符重载:实现了+、-、*、/以及++、--等运算符,确保运算后正确维护前值、最小值和最大值。
  • 复合赋值支持:编译器可通过二元运算符自动推导+=、-=等操作,也可手动重载以优化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:35:32