亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C# 运算符重载完全指南:自定义类型的运算符行为定义

C# 允许重定义或重载大多数内置运算符,使程序员能将运算符用于用户定义类型。重载运算符是特殊名称的函数:operator 关键字后跟运算符符号。与其他函数一样,有返回类型和参数列表。

运算符重载实现

以 Box 类为例,重载加法运算符 +:

public static Box operator+ (Box b, Box c) {
    Box box = new Box();
    box.length = b.length + c.length;
    box.breadth = b.breadth + c.breadth;
    box.height = b.height + c.height;
    return box;
}

该函数实现两个 Box 对象相加,返回新的 Box 对象。

完整实现示例

using System;
namespace OperatorOvlApplication {
    class Box {
        private double length, breadth, height;
        
        public double getVolume() { return length * breadth * height; }
        public void setLength(double len) { length = len; }
        public void setBreadth(double bre) { breadth = bre; }
        public void setHeight(double hei) { height = hei; }
        
        // 重载 + 运算符
        public static Box operator+ (Box b, Box c) {
            Box box = new Box();
            box.length = b.length + c.length;
            box.breadth = b.breadth + c.breadth;
            box.height = b.height + c.height;
            return box;
        }
    }
    
    class Tester {
        static void Main(string[] args) {
            Box Box1 = new Box(), Box2 = new Box(), Box3 = new Box();
            double volume = 0.0;
            
            Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0);
            Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0);
            
            volume = Box1.getVolume();
            Console.WriteLine("Volume of Box1 : {0}", volume);  // 210
            
            volume = Box2.getVolume();
            Console.WriteLine("Volume of Box2 : {0}", volume);  // 1560
            
            // 使用重载的 + 运算符
            Box3 = Box1 + Box2;
            volume = Box3.getVolume();
            Console.WriteLine("Volume of Box3 : {0}", volume);  // 5400
            Console.ReadKey();
        }
    }
}

可重载与不可重载运算符

类别运算符可重载性
一元运算符+, -, !, ~, ++, --✓ 可重载
二元算术+, -, *, /, %✓ 可重载
比较运算符==, !=, <, >, <=, >=✓ 可重载(成对重载)
条件逻辑&&, ||✗ 不可直接重载(通过重载 true/false 间接支持)
赋值运算符+=, -=, *=, /=, %=✗ 不可重载(复合赋值自动对应基础运算符)
其他=, ., ?:, ->, new, is, sizeof, typeof✗ 不可重载

扩展示例:重载比较运算符与 ToString

public static bool operator == (Box lhs, Box rhs) {
    return lhs.length == rhs.length && lhs.height == rhs.height && lhs.breadth == rhs.breadth;
}

public static bool operator != (Box lhs, Box rhs) {
    return !(lhs == rhs);  // 建议复用 == 实现
}

public static bool operator < (Box lhs, Box rhs) {
    return lhs.length < rhs.length && lhs.height < rhs.height && lhs.breadth < rhs.breadth;
}

public static bool operator > (Box lhs, Box rhs) {
    return lhs.length > rhs.length && lhs.height > rhs.height && lhs.breadth > rhs.breadth;
}

public static bool operator <= (Box lhs, Box rhs) {
    return lhs == rhs || lhs < rhs;
}

public static bool operator >= (Box lhs, Box rhs) {
    return lhs == rhs || lhs > rhs;
}

public override string ToString() {
    return String.Format("({0}, {1}, {2})", length, breadth, height);
}

测试代码

Box Box1 = new Box(); Box1.setLength(6); Box1.setBreadth(7); Box1.setHeight(5);
Box Box2 = new Box(); Box2.setLength(12); Box2.setBreadth(13); Box2.setHeight(10);
Box Box3 = Box1 + Box2;
Box Box4 = Box3;

Console.WriteLine("Box 1: {0}", Box1);  // (6, 7, 5)
Console.WriteLine("Box 2: {0}", Box2);  // (12, 13, 10)
Console.WriteLine("Box 3: {0}", Box3);  // (18, 20, 15)

Console.WriteLine(Box1 > Box2 ? "Box1 > Box2" : "Box1 <= Box2");  // Box1 <= Box2
Console.WriteLine(Box1 < Box2 ? "Box1 < Box2" : "Box1 >= Box2");  // Box1 < Box2
Console.WriteLine(Box3 == Box4 ? "Box3 == Box4" : "Box3 != Box4");  // Box3 == Box4

重载规则与最佳实践

C语言

  1. 操作员参与维护:收益是否大于隐性成本?
  2. DIY仿Wall-E树莓派CD盒机器人
  3. C#运算符——C#运算符全面指南
  4. C# 三元运算符:条件表达式简明指南
  5. 掌握 C# 方法重载:核心概念、实战示例与最佳实践
  6. 掌握 C# 构造函数重载:灵活创建对象的多种姿势
  7. C++ 运算符重载实战指南:语法、方法、限制与代码示例
  8. C++重载机制深度解析:函数重载与运算符重载全攻略
  9. C# 类完全指南:定义、封装、构造函数、析构函数与静态成员
  10. MATLAB 基础语法速成:交互计算、变量、运算符、格式控制与注释
  11. 精通 Python 运算符重载:实战指南
  12. Java instanceof 运算符完全指南:用法、继承与接口检查