详情

首页手游攻略 C# 运算符重载的实现方式示例实用指南

C# 运算符重载的实现方式示例实用指南

佚名 2026-10-15 09:20:02

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“C# 运算符重载的实现方法示例”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

一、运算符重载 核心概念

1. 定义

运算符重载属于 静态多态,指重新定义原有运算符的运算逻辑。

核心作用:让 自定义类的对象 兼容 +、-、++、>、< 等运算(默认对象不能直接运算)。

2. 固定语法(必背)

public static 返回值类型 operator 运算符(参数列表)
{
    // 自定义运算逻辑
}

强制要求:必须是 public static,缺一不可。

二、实战逐类重载解析(Box 盒子案例)

业务场景:定义盒子类,包含长宽高,借助重载实现对象之间运算、体积比较。

1. 加号 + 重载(对象 + 对象 = 新对象)

逻辑:两个盒子长宽高分别对应相加,得到新盒子对象

public static Box operator +(Box b1, Box b2)
{
    return new Box()
    {
        Length = b1.Length + b2.Length,
        Width = b1.Width + b2.Width,
        Height = b1.Height + b2.Height
    };
}

调用:Box b3 = b1 + b2;

2. 减号 - 重载(对象 - 对象 = 整型差值)

逻辑:不做属性相减,计算两个盒子体积差值,得到 int 类型

public static int operator -(Box b1, Box b2)
{
    return b1.Length * b1.Width * b1.Height - b2.Length * b2.Width * b2.Height;
}

调用:int b4 = b1 - b2;

关键点:运算符重载得到值类型能够自定义,不强制和参数类型一致。

3. 自增 ++ 重载(重点易错)

逻辑:盒子长宽高各自 +1,得到新对象

public static Box operator ++(Box b1)
{
    return new Box()
    {
        Length = b1.Length + 1,
        Width = b1.Width + 1,
        Height = b1.Height + 1,
    };
}

运行结果解析(核心坑点)

Box b5 = b1++;
Console.WriteLine(b1.Length);//11 原对象已更新
Console.WriteLine(b5.Length);//10 返回的是旧值对象

自增重载遵循 后置自增规则:先赋值、后自增。

4. 大于 >、小于 < 成对重载(强制规则)

业务逻辑:根据 盒子体积 Volume 比较大小

//重载大于
public static bool operator >(Box b1, Box b2)
{
    return b1.Volume > b2.Volume;
}

//重载小于
public static bool operator <(Box b1, Box b2)
{
    return b1.Volume < b2.Volume;
}

调用结果:

  • b1 > b2 → false(b1体积更小)
  • b1 < b2 → true

三、运算符重载 硬性规则(考试必考)

1. 语法规则

  • 必须是 public static 静态方法
  • 必须采用 operator 关键字
  • 参数个数固定:双目运算符2个参数,单目运算符1个参数

2. 成对重载规则(超级重点)

可重载与不可重载的运算符

运算符可重载性
+、-、!、++、--这些一元运算符能够进行重载
<、>、=、!=、<=、>=这些二元运算符能够进行重载,这里需留意某些运算符必须成对重载
&&、||无法重载逻辑运算符
(type)var_name强制类型转换运算符不能重载
+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=在这个场景下,复合赋值运算符不能显式重载。 但在重载二元运算符时,也会隐式重载相应的复合赋值运算符,比如重载了+运算符也会隐式的重载+=
^、=、.、?.、? :、??、??=、..、->、=>、as、await、checked、unchecked、default、delegate、is、nameof、new、sizeof、stackalloc、switch、typeof这些运算符无法进行重载

注意:比较运算符必须成对重载,也就是说,如果重载一对运算符中的任意一个,则另一个运算符也必须重载。比如==和!=运算符、<和>运算符、<=和>=运算符

四、代码完整执行流程复盘

Box b1 = new Box(10, 20, 30);
Box b2 = new Box(30, 40, 50);

b1 + b2 // 属性分别相加,返回新盒子
b1 - b2 // 计算体积差值,返回int
b1++ // 长宽高+1,后置自增
b1 > b2 // 体积对比 返回false
b1 < b2 // 体积对比 返回true

五、满分背诵口诀

  • 运算符重载,静态公开不能少
  • operator关键字,自定义对象运算
  • 加减自增随意改,比较符号必须成对
  • 得到类型可自定义,参数量级固定死
  • 属于静态多态,编译期间就绑定

结合项目来看,总的来说,C# 运算符重载适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。

点击查看更多
推荐专题
热门阅读