以下是原文翻译成繁體中文的版本:

C# - Anonymous Methods

# C# - 匿名方法:初学者的友好指南

你好,未來的程式設計師們!今天,我們將踏上一段令人興奮的旅程,進入C#的世界,並探索一個名為匿名方法的概念。別擔心如果這聽起來有點神秘 - 在這個教學結束之前,你將會像專業人士一樣運用這些強大的工具!

## 什麼是匿名方法?

在我們深入之前,讓我們先解釋一下在編程中"匿名"是什麼意思。在編程領域中,"匿名"簡單地意味著"沒有名字"。所以,匿名方法就是一個沒有名字的方法(一組指導語句)。這就像編程世界的秘密間諜 - 它在不知名的情況下完成其工作!

匿名方法是創建小型的、內聯的代碼片段的一種方式,這些代碼片段可以被當作對象傳來傳去。當你需要一個快速、一次性使用的方法,而不想麻煩正式聲明它時,它們特別有用。

## 寫作匿名方法

現在,讓我們捋起袖子看看如何寫一個匿名方法。基本語法看起來像這樣:

```csharp
delegate(parameters)
{
    // 方法體
};

別讓這個嚇到你!讓我們分解一下:

  1. delegate 是一個關鍵字,告訴C#我們即將定義一個沒有名字的方法。
  2. (parameters) 是我們列出方法需要的任何輸入的地方,就像在常规方法中一樣。
  3. 花括號 { } 包含我們的方法將要執行的實際代碼。

一個簡單的例子

讓我們從一个非常簡單的例子開始:

Action sayHello = delegate()
{
    Console.WriteLine("Hello, Anonymous Method!");
};

sayHello();

如果你運行這段代碼,你將會在控制台上看到 "Hello, Anonymous Method!" 被打印出來。讓我們分解一下發生了什麼:

  1. 我們創建了一個名為 sayHello 的變量,類型為 Action。一個 Action 是C#中的一個內置委託類型,它代表一個不返回值的方法。
  2. 我們將一個匿名方法賦值給這個變量。這個方法不接收任何參數(這就是為什麼括號是空的),並且只是打印一條消息。
  3. 我們可以使用 sayHello() 來調用這個方法,就像我們會使用一個常规的命名方法一樣。

更複雜的例子

示例 1:帶參數的匿名方法

讓我們創建一個帶參數的匿名方法:

Func<int, int, int> add = delegate(int a, int b)
{
    return a + b;
};

int result = add(5, 3);
Console.WriteLine($"5 + 3 = {result}");

在這個例子中:

  1. 我們使用 Func<int, int, int>,它代表一個接收兩個 int 參數並返回一個 int 的方法。
  2. 我們的匿名方法接收兩個參數,ab,並返回它們的總和。
  3. 我們可以像使用任何其他方法一樣使用這個方法,傳入值並獲得結果。

示例 2:帶循環的匿名方法

匿名方法也可以包含更複雜的邏輯:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

numbers.ForEach(delegate(int num)
{
    if (num % 2 == 0)
    {
        Console.WriteLine($"{num} 是偶數");
    }
    else
    {
        Console.WriteLine($"{num} 是奇數");
    }
});

這裡發生了什麼:

  1. 我們有一個數字列表。
  2. 我們使用列表的 ForEach 方法,它接受一個委託作為參數。
  3. 我們的匿名方法是那個委託。它接受列表中的每個數字,檢查它是偶數還是奇數,並打印結果。

何時使用匿名方法

匿名方法對於短暫的、一次性使用的代碼片段來說非常棒。它們通常用於:

  1. 事件處理器
  2. LINQ 查詢
  3. 需要委託參數的方法(如我們上面的 ForEach 示例)

然而,如果你發現自己在多次寫同樣的匿名方法,那麼可能最好是創建一個命名方法。

一個警告

雖然匿名方法很強大,但如果過度使用,它們可能會使你的代碼難以閱讀。始終優先考慮代碼的清晰度。如果匿名方法變得太複雜,考慮將其拆分為命名方法。

結論

恭喜你!你剛剛踏出了進入C#匿名方法世界的第一步。這些小巧的代碼片段可以使你的編程更靈活和簡潔。隨著你繼續在C#的旅程上前行,你會發現更多可以使用匿名方法節省時間和簡化代碼的情況。

記住,掌握編程概念的金鍵是練習。所以,不要猶豫 - 在你自己的專案中嘗試匿名方法。在你意識到之前,你將會像一個有經驗的專業人士一樣使用它們!

快樂編程,願你的方法總是運行順利,無論它們是否有名字!



| 方法類型 | 語法 | 使用場合 |
|----------|------|----------|
| 簡單匿名方法 | `delegate() { /* 代碼 */ }` | 快速、簡單的操作 |
| 帶參數的匿名方法 | `delegate(param1, param2) { /* 代碼 */ }` | 需要輸入的操作 |
| 有返回值的匿名方法 | `delegate() { return /* 值 */; }` | 需要產生結果的操作 |
| LINQ 中的匿名方法 | `list.Where(delegate(item) { return /* 條件 */; })` | 過濾或轉換集合 |
| 事件處理器的匿名方法 | `button.Click += delegate(sender, e) { /* 代碼 */ }` | 處理UI事件 |

Credits: Image by storyset