C# 中的运算符重载

 
 

在 C# 中,运算符重载允许程序员为用户定义的类型提供运算符的自定义实现。这意味着可以根据操作数的类型,定义运算符的行为。例如,可以重载加法运算符 +,以便在两个自定义类型的对象之间进行加法运算。

代码示例

以下是一个简单的示例,展示了如何为表示有理数的结构重载算术运算符:

public readonly struct Fraction
{
private readonly int num;
private readonly int den;

public Fraction(int numerator, int denominator)
{
if (denominator == 0)
{
throw new ArgumentException("Denominator cannot be zero.", nameof(denominator));
}
num = numerator;
den = denominator;
}

public static Fraction operator +(Fraction a) => a;
public static Fraction operator -(Fraction a) => new Fraction(-a.num, a.den);
public static Fraction operator +(Fraction a, Fraction b)
=> new Fraction(a.num * b.den + b.num * a.den, a.den * b.den);
public static Fraction operator -(Fraction a, Fraction b)
=> a + (-b);
public static Fraction operator *(Fraction a, Fraction b)
=> new Fraction(a.num * b.num, a.den * b.den);
public static Fraction operator /(Fraction a, Fraction b)
{
if (b.num == 0)
{
throw new DivideByZeroException();
}
return new Fraction(a.num * b.den, a.den * b.num);
}

public override string ToString() => $"{num} / {den}";
}

public static class OperatorOverloading
{
public static void Main()
{
var a = new Fraction(5, 4);
var b = new Fraction(1, 2);
Console.WriteLine(-a); // 输出: -5 / 4
Console.WriteLine(a + b); // 输出: 14 / 8
Console.WriteLine(a - b); // 输出: 6 / 8
Console.WriteLine(a * b); // 输出: 5 / 8
Console.WriteLine(a / b); // 输出: 10 / 4
}
}

重载规则

要重载运算符,需要遵循一些规则:

  • 使用 operator 关键字声明运算符。

  • 运算符声明必须同时包含 public 和 static 修饰符。

  • 一元运算符有一个输入参数,二元运算符有两个输入参数。至少有一个参数必须是包含运算符声明的类型。

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

C# 允许重载多种运算符,例如一元运算符、算术运算符、相等运算符和比较运算符。但也有一些运算符是不可重载的,例如 &&、||、[]、()、. 和 ?:。

重载的作用

运算符重载的主要作用是提供更自然的语法和操作符语义,以适应用户定义的数据类型。它可以提高代码的可读性和可维护性。

注意事项

在使用运算符重载时,需要注意以下几点:

  • 不能仅通过返回类型来区分重载的运算符。

  • 重载的运算符必须至少在参数类型、参数个数或参数顺序上有所不同。

  • 重载运算符不会改变运算符的优先级。

  • 应谨慎使用运算符重载,以避免混淆和误用。

通过这些规则和示例,可以看出 C# 中的运算符重载是一种强大的特性,它允许开发者为自定义类型提供直观的操作符行为。

posted on 2025-05-12 15:35  漫思  阅读(39)  评论(0)    收藏  举报

导航