以下是原文翻译成繁體中文的內容:

C# - Operator Overloading

# C# - 運算子重載:初學者指南

你好啊,未來的編程超級巨星!今天,我們將要深入探索 C# 中運算子重載的迷人世界。別擔心如果你之前從未寫過一行代碼——我會成為你這次令人興奮旅程中的友好導遊。在這個教程結束時,你將會像專家一樣重載運算子!

## 那麼什麼是運算子重載?

在我們進入細節之前,讓我們先了解運算子重載到底是什麼。想像你有一個神奇的盒子,它能將普通的符號轉化為非凡的行動。這就是 C# 中運算子重載的基本原理!

簡單來說,運算子重載讓我們能夠為我們的自定義類中的運算符賦予特殊含義。這就像教一個老狗學新把戲!

## 實現運算子重載

現在,讓我們捋起袖子學習如何實現運算子重載。這可能比你想像的還要容易!

### 基本語法

以下是運算符重載的基本語法:

```csharp
public static 返回類型 operator 運算符符號(參數)
{
    // 實作
}

讓我們分解這個語法:

  • public static:這兩個關鍵字在運算子重載中總是被使用。
  • 返回類型:運算符將返回的類型。
  • operator:這個關鍵字告訴 C# 我們正在重載一個運算符。
  • 運算符符號:運算符的真實符號(如 +、-、*、等)。
  • 參數:我們運算符的輸入。

一個簡單的例子:複數的加法

假設我們想要加兩個複數。我們將創建一個 Complex 類並重載 + 運算符。以下是我們如何操作的:

public class Complex
{
    public double 實部 { get; set; }
    public double 虛部 { get; set; }

    public Complex(double 實部, double 虛部)
    {
        實部 = 實部;
        虛部 = 虛部;
    }

    public static Complex operator +(Complex c1, Complex c2)
    {
        return new Complex(c1.實部 + c2.實部, c1.虛部 + c2.虛部);
    }

    public override string ToString()
    {
        return $"{實部} + {虛部}i";
    }
}

現在,讓我們使用我們新重載的運算符:

Complex num1 = new Complex(3, 4);
Complex num2 = new Complex(1, 2);
Complex sum = num1 + num2;
Console.WriteLine($"總和是: {sum}");  // 輸出: 總和是: 4 + 6i

這不是很酷嗎?我們剛剛教 C# 如何使用 + 運算符來加複數!

可重載與不可重載的運算符

現在你可能會想,"我可以重載任何運算符嗎?" 事實上,並不是。C# 關於哪些運算符可以重載,哪些不能重載有一些規則。

以下是一個方便的表格,列出了可重載和不可重載的運算符:

可重載運算符 不可重載運算符
+, -, *, /, % . (成員訪問)
&, |, ^, <<, >> ?: (條件)
==, !=, <, >, <=, >= = (賦值)
! (邏輯非) && 和 || (邏輯與/或)
~ (位元非) [] (數組索引)
++ 和 -- (遞增/遞減) () (調用)
true 和 false new
隱式和顯式 (類型轉換) typeof
sizeof
is 和 as (類型檢查)

記住這個表格——當你在類中決定重載哪些運算符時,它會派上用場!

更多例子:讓我們創新!

範例 1:將向量乘以標量

讓我們創建一個 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 v, double 標量)
    {
        return new Vector(v.X * 標量, v.Y * 標量);
    }

    public override string ToString()
    {
        return $"({X}, {Y})";
    }
}

// 使用
Vector v = new Vector(3, 4);
Vector result = v * 2;
Console.WriteLine($"結果: {result}");  // 輸出: 結果: (6, 8)

在這個例子中,我們教 C# 如何使用 * 運算符將向量乘以標量。相當厲害,不是嗎?

範例 2:比較自定義物件

讓我們創建一個 Person 類並重載比較運算符:

public class Person
{
    public string 姓名 { get; set; }
    public int 年齡 { get; set; }

    public Person(string 姓名, int 年齡)
    {
        姓名 = 姓名;
        年齡 = 年齡;
    }

    public static bool operator >(Person p1, Person p2)
    {
        return p1.年齡 > p2.年齡;
    }

    public static bool operator <(Person p1, Person p2)
    {
        return p1.年齡 < p2.年齡;
    }

    public override string ToString()
    {
        return $"{姓名} (年齡: {年齡})";
    }
}

// 使用
Person alice = new Person("Alice", 30);
Person bob = new Person("Bob", 25);
Console.WriteLine($"Alice 比 Bob 老嗎? {alice > bob}");  // 輸出: Alice 比 Bob 老嗎? True

現在,我們可以使用 >< 運算符基於年齡來比較 Person 物件。這不是很酷嗎?

結論:運算子重載的力量

恭喜你!你剛剛解鎖了 C# 工具包中的一個強大工具。運算子重載讓我們的代碼更直觀、更易於閱讀。這就像給我們的類賦予超能力!

記住,能力越大,責任越大。謹慎使用運算子重載,並始終確保重載的運算符行為對你的類來說是合理的。

持續練習,持續編程,很快你將會使用 C# 創造出令人驚奇的事物。未來的開發者,快樂編程!

Credits: Image by storyset