如何创建行为与int完全一致但非int的自定义struct?
实现方法
核心思路
创建一个包装int字段的struct,通过运算符重载和隐式/显式转换模拟int的全部行为。这种方式既保证当前和int的行为完全一致,又能在未来轻松添加或移除特性,完美避开struct不支持继承的限制。
最简代码示例
public struct MyInt { // 内部存储int值 private readonly int _value; // 构造函数 public MyInt(int value) => _value = value; // 隐式转换:int转MyInt,实现直接赋值 public static implicit operator MyInt(int value) => new MyInt(value); // 隐式转换:MyInt转int,实现直接当作int使用 public static implicit operator int(MyInt myInt) => myInt._value; // 重载基础算术运算符 public static MyInt operator +(MyInt a, MyInt b) => new MyInt(a._value + b._value); public static MyInt operator -(MyInt a, MyInt b) => new MyInt(a._value - b._value); public static MyInt operator *(MyInt a, MyInt b) => new MyInt(a._value * b._value); public static MyInt operator /(MyInt a, MyInt b) => new MyInt(a._value / b._value); public static MyInt operator %(MyInt a, MyInt b) => new MyInt(a._value % b._value); // 重载比较运算符 public static bool operator ==(MyInt a, MyInt b) => a._value == b._value; public static bool operator !=(MyInt a, MyInt b) => a._value != b._value; public static bool operator >(MyInt a, MyInt b) => a._value > b._value; public static bool operator <(MyInt a, MyInt b) => a._value < b._value; public static bool operator >=(MyInt a, MyInt b) => a._value >= b._value; public static bool operator <=(MyInt a, MyInt b) => a._value <= b._value; // 重载自增自减运算符 public static MyInt operator ++(MyInt a) => new MyInt(a._value + 1); public static MyInt operator --(MyInt a) => new MyInt(a._value - 1); // 重载位运算(按需添加) public static MyInt operator &(MyInt a, MyInt b) => new MyInt(a._value & b._value); public static MyInt operator |(MyInt a, MyInt b) => new MyInt(a._value | b._value); // 重写值类型必备方法,保证行为和int一致 public override bool Equals(object obj) => obj is MyInt other && _value == other._value; public override int GetHashCode() => _value.GetHashCode(); public override string ToString() => _value.ToString(); }
优势与灵活性
- 无缝交互:隐式转换让你可以像用int一样用这个struct,比如
MyInt num = 10; int regularInt = num;,完全不需要额外处理。 - 易扩展/修改:未来要移除某个特性(比如禁止减法),直接删掉对应的运算符重载即可;要新增特性(比如添加自定义验证),直接在构造函数或运算符里加逻辑。
- 类型安全:这个struct是独立类型,不会被误当成int,避免后续修改时的类型混淆问题。
注意事项
- 如果后续要限制类型转换,可以把
implicit改成explicit,强制用户手动转换,增强类型安全性。 - 若需要支持和其他数值类型(如long、float)的运算,只需新增对应的运算符重载即可。
内容的提问来源于stack exchange,提问作者Dailysmiler
相关产品推荐
相关产品推荐

