📜  C#|运算符重载(1)

📅  最后修改于: 2023-12-03 15:30:18.316000             🧑  作者: Mango

C# 运算符重载

当我们在使用 C# 编写程序时,经常会用到各种运算符,比如加号(+)用于加法运算,减号(-)用于减法运算,等号(=)用于赋值等操作。C# 允许我们重载这些运算符,使得我们可以自定义运算符的行为。这在某些情况下非常有用,特别是当我们在设计自定义类型时需要实现某些操作时。

运算符重载的基本语法

在 C# 中,重载运算符的语法如下:

public static [operator] 返回值类型 operator 运算符符号(参数类型 参数1, 参数类型 参数2)
{
    // 执行运算
}

在这个语法中,operator 可以是以下任意一个运算符:+、-、*、/、%、&、|、^、<<、>>、==、!=、<、>、<=、>= 和 !。返回值类型 就是运算的结果类型,由我们自己根据需要来定义。运算符符号 就是我们要重载的运算符号,如加号(+)、减号(-)等。参数类型 就是运算符的操作数类型。如果我们要重载加号(+)运算符,比如对两个自定义类型的对象进行相加运算,则第一个参数类型应该是我们自定义类型的类名,第二个参数类型应该是我们要相加的自定义类型的类名,如下所示:

public static MyClass operator +(MyClass firstObj, MyClass secondObj)
{
    // 执行相加运算
}
运算符重载的实例

假设我们要自定义一个向量类型,我们可以定义一个 Vector 类:

public class Vector
{
    public double X { get; set; }
    public double Y { get; set; }

    public Vector(double x, double y)
    {
        X = x;
        Y = y;
    }

    public static Vector operator +(Vector v1, Vector v2)
    {
        return new Vector(v1.X + v2.X, v1.Y + v2.Y);
    }

    public static Vector operator -(Vector v1, Vector v2)
    {
        return new Vector(v1.X - v2.X, v1.Y - v2.Y);
    }

    public static Vector operator *(Vector v, double scalar)
    {
        return new Vector(v.X * scalar, v.Y * scalar);
    }

    public static Vector operator *(double scalar, Vector v)
    {
        return v * scalar;
    }

    public static bool operator ==(Vector v1, Vector v2)
    {
        return v1.X == v2.X && v1.Y == v2.Y;
    }

    public static bool operator !=(Vector v1, Vector v2)
    {
        return !(v1 == v2);
    }

    // 可以根据需要重载其它运算符
}

在上面的代码中,我们自定义了向量类型 Vector,并重载了加号(+)、减号(-)、乘号(*)和等号(==、!=)等运算符。通过这样的方式,我们可以对自定义类型的对象进行运算,并实现自定义的行为。比如,我们现在可以对两个向量实例进行相加运算:

Vector v1 = new Vector(1, 2);
Vector v2 = new Vector(3, 4);
Vector v3 = v1 + v2; // v3 的值为 (4, 6)
总结

通过运算符重载,我们可以为自定义类型实现自定义的运算行为,使得我们的编程工作更加方便和灵活。我们可以根据需要重载各种运算符,以实现我们自己的需求。