C# 编程指南:运算符重载

在C#中,运算符重载允许我们为自定义的类或结构定义特定运算符的行为。通过重载运算符,我们可以定义自定义类型之间的运算逻辑,使其能够像内置类型一样使用运算符。

部分
1
运算符重载的语法
运算符重载是在类或结构中定义的特殊方法,方法名以 operator 关键字开头,后面跟着要重载的运算符符号。
运算符重载方法必须是公共静态方法,并且返回类型与运算符的结果类型相匹配。
运算符重载方法接受两个操作数作为参数,并返回运算结果。
using System;

public class ComplexNumber
{
    public double Real { get; set; }
    public double Imaginary { get; set; }

    public ComplexNumber(double real, double imaginary)
    {
        Real = real;
        Imaginary = imaginary;
    }

    // 加法运算符重载
    public static ComplexNumber operator +(ComplexNumber c1, ComplexNumber c2)
    {
        double real = c1.Real + c2.Real;
        double imaginary = c1.Imaginary + c2.Imaginary;
        return new ComplexNumber(real, imaginary);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        ComplexNumber c1 = new ComplexNumber(3, 4);
        ComplexNumber c2 = new ComplexNumber(2, 5);

        ComplexNumber result = c1 + c2;

        Console.WriteLine("Result: " + result.Real + " + " + result.Imaginary + "i");
    }
}

在上述示例中,我们定义了一个名为 ComplexNumber 的复数类,并重载了加法运算符 +。在重载方法中,我们按照复数的加法规则将实部和虚部相加,并返回一个新的 ComplexNumber 对象。 在 Main 方法中,我们创建了两个复数对象 c1 和 c2,然后使用重载的加法运算符将它们相加,将结果存储在 result 变量中,并将结果打印出来。

部分
2
可以重载的运算符
一元运算符:+、-、!、~、++、--
二元运算符:+、-、*、/、%、&、|、^、<<、>>、==、!=、>、<、>=、<=
赋值运算符:=
类型转换运算符:explicit、implicit
注意:

并非所有的运算符都可以被重载,而只有指定的一些运算符可以被重载。

using System;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    // 相等运算符重载
    public static bool operator ==(Person person1, Person person2)
    {
        if (ReferenceEquals(person1, person2))
            return true;

        if (person1 is null || person2 is null)
            return false;

        return person1.Name == person2.Name && person1.Age == person2.Age;
    }

    // 不等运算符重载
    public static bool operator !=(Person person1, Person person2)
    {
        return !(person1 == person2);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Person person1 = new Person("John Doe", 30);
        Person person2 = new Person("John Doe", 30);
        Person person3 = new Person("Jane Smith", 25);

        Console.WriteLine("person1 == person2: " + (person1 == person2)); // 输出:True
        Console.WriteLine("person1 != person3: " + (person1 != person3)); // 输出:True
    }
}

在上述示例中,我们定义了一个名为 Person 的人类,并重载了相等运算符 == 和不等运算符 !=。在重载方法中,我们比较了两个人对象的名称和年龄是否相等来确定它们是否相等。 在 Main 方法中,我们创建了三个人对象 person1、person2 和 person3,然后使用重载的相等运算符和不等运算符来比较它们的相等性,并将结果打印出来。 通过运算符重载,我们可以为自定义类型定义运算符的行为,使其具备与内置类型相似的使用方式。这样可以提高代码的可读性和可维护性。 需要注意的是,运算符重载应该谨慎使用,遵循一致的语义和最佳实践。重载的运算符行为应符合直觉,并与内置类型的运算符行为保持一致。

    目录

  • 1.
    运算符重载的语法
  • 2.
    可以重载的运算符