如何实现支持运算符重载的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
相关产品推荐
相关产品推荐

