---
# System prepended metadata

title: C#擴充方法(Extension methods)
tags: [dotnet, C#]

---

# **C#擴展方法**
 
 ###### C# Extension Methods (擴充方法) 是一種極具彈性和可擴展性的技術，它可以為現有的 Class 添加新的方法，而不需要修改原本的Class。
 
 ---

C# 的擴充方法（Extension Methods）提供了一種在不修改現有類型的情況下擴展其功能的方式。以下是使用擴充方法的一些好處：

1. **無需修改原始代碼：** 使用擴充方法，你無需修改現有的類型或結構。這意味著你可以在不破壞現有代碼的情況下擴展其功能。
2. **提高代碼可讀性：** 擴充方法允許你將相關的功能組織在一起，提高代碼的結構性和可讀性。這使得代碼更易於理解和維護。
3. **增強代碼重用性：** 通過擴充現有類型，你可以在多個地方重複使用相同的擴充方法，而不必在每個地方都實現相同的功能。
4. **更自然的語法：** 擴充方法使得代碼的語法更自然，看起來就像是對現有類型的本地擴展，提高了代碼的可讀性。
5. **提高代碼的模組化：** 擴充方法有助於將代碼拆分為更小的模組，每個模組處理一個特定的功能。這提高了代碼的模組化，使得代碼更易於理解和維護。


總體而言，擴充方法是一種強大的技術，可以使你的代碼更具靈活性、可讀性和可維護性。然而，在使用時應謹慎，以確保它們被合理地使用並符合代碼的整體結構。

---

##### 程式碼範例
擴展String方法，新增以Environment.NewLine切割後的長度

非擴充方法 : 
```
var mutilineText = @"Spring
    Summer
    Autumn
    Winner";
    
int CountLines(string input) => input.Split(Environment.NewLine).Length;

Console.WriteLine(CountLines(mutilineText));
```

假設我們程式經手多個程式人員，大家都直接新增對於字串的方法，會導致方法很多、很雜，到處都是。

```
var mutilineText = @"Spring
    Summer
    Autumn
    Winner";
    
    
public static class StringExtendions
{
    public static int CountLines(this string input)=>
        input.Split(Environment.NewLine).Length;
        
    #可在額外新增方法.....
}

Console.WriteLine(CountLines(mutilineText)); 可直接以string.Extentionmethods

Console.WriteLine(mutilineText.CountLines());
```

此外擴展方法允許我們向無法訪問的類型添加功能，例如 Enum
```
public enum Season
{
    Spring,
    Summer,
    Autumn,
    Winner
}

public static class SeasonExtension
{
    public static Season Next(this Season season)
    {
        int seasonInt  =(int)season;
        int nextSeason = (seasonInt + 1) % 4;
        return (Season)nextSeason;
    }
       
}

Console.WriteLine(Season.Spring.Next());//Winter
```