.NET 幫助

C# 擴充方法(開發人員如何使用)

發佈 2024年8月15日
分享:

擴展方法是 C# 中的一個強大功能,允許你在不修改源代碼的情況下為現有類型添加新功能。 它們在提高程式碼可讀性和可維護性方面極其有用。 在本指南中,我們將探討擴展方法的基礎知識以及如何實現它們。

什麼是擴展方法?

擴展方法是特殊的靜態方法,可以像現有類型的實例方法一樣被調用。 它們是一種便捷的方法,可以在不更改原始源代碼或繼承類的情況下,為現有類別添加新方法。

要創建擴展方法,您需要在靜態類中定義一個靜態方法。 該方法的第一個參數應為您想要擴展的類型,並以 this 關鍵字作為前綴。 這個特殊的關鍵字告訴 C# 編譯器這是一個擴展方法。

在 C# 中實現擴展方法

現在我們知道擴展方法是什麼了,讓我們來實作一個。 假設你有一個字串想要反轉。 與其為此撰寫一個單獨的函數,不如為字符串類創建擴展方法。

首先,我們來建立一個名為 StringExtensions 的新的靜態類別。 類別名稱並不重要,但通常的慣例是使用被擴展類型的名稱,後接「Extensions」。 在這個類中,我們將定義一個名為 Reverse 的靜態方法:

public static class StringExtensions
{
   public static string Reverse(this string input)
   {
       char[] chars = input.ToCharArray();
       Array.Reverse(chars);
       return new string(chars);
   }
}
public static class StringExtensions
{
   public static string Reverse(this string input)
   {
       char[] chars = input.ToCharArray();
       Array.Reverse(chars);
       return new string(chars);
   }
}
Public Module StringExtensions
   <System.Runtime.CompilerServices.Extension> _
   Public Function Reverse(ByVal input As String) As String
	   Dim chars() As Char = input.ToCharArray()
	   Array.Reverse(chars)
	   Return New String(chars)
   End Function
End Module
VB   C#

在此範例中,我們創建了一個名為 Reverse 的公共靜態字串方法,具有單一參數。 this 關鍵字在字串類型之前表示這是一個字串類別的擴充方法。

現在,讓我們看看如何在我們的 Program 類中使用這個新的擴充方法:

class Program
{
   static void Main(string[] args)
   {
       string example = "Hello, World!";
       string reversed = example.Reverse();
       Console.WriteLine(reversed); // !dlroW ,olleH
   }
}
class Program
{
   static void Main(string[] args)
   {
       string example = "Hello, World!";
       string reversed = example.Reverse();
       Console.WriteLine(reversed); // !dlroW ,olleH
   }
}
Friend Class Program
   Shared Sub Main(ByVal args() As String)
	   Dim example As String = "Hello, World!"
	   Dim reversed As String = example.Reverse()
	   Console.WriteLine(reversed) ' !dlroW ,olleH
   End Sub
End Class
VB   C#

請注意,我們不需要創建 StringExtensions 類的實例。 相反地,我們直接在字串實例上使用了 Reverse 方法,好像它是一個實例方法。

擴展方法語法

擴充方法看起來與行為都像實例方法,但有一些重要差異需注意:

  • 擴展方法不能訪問擴展類型的私有成員
  • 它們也不參與繼承或多型性。
  • 您不能使用擴展方法覆蓋現有的方法。

    如果擴展型別具有與擴展方法相同簽名的方法,則實例方法將始終具有優先權。 只有在沒有相符的實例方法時,才會調用擴展方法。

擴展方法的實際範例

現在我們已經了解了 C# 擴充方法的基礎,讓我們來看看一些實際的例子。

字串擴充方法字數計算

想像一下你想要計算字串中的單詞數量。 您可以為字串類別創建一個 WordCount 擴展方法:

public static class StringExtensions
{
   public static int WordCount(this string input)
   {
       return input.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Length;
   }
}
public static class StringExtensions
{
   public static int WordCount(this string input)
   {
       return input.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Length;
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

現在,您可以輕鬆地計算字串中的單詞數量,如下所示:

string text = "Extension methods are awesome!";
int wordCount = text.WordCount();
Console.WriteLine($"The text has {wordCount} words."); // The text has 4 words.
string text = "Extension methods are awesome!";
int wordCount = text.WordCount();
Console.WriteLine($"The text has {wordCount} words."); // The text has 4 words.
Dim text As String = "Extension methods are awesome!"
Dim wordCount As Integer = text.WordCount()
Console.WriteLine($"The text has {wordCount} words.") ' The text has 4 words.
VB   C#

IEnumerable 擴充方法中位數

假設你有一組數字,並希望計算其中位數。 您可以為 IEnumerable 創建一個擴展方法:

public static class EnumerableExtensions
{
   public static double Median(this IEnumerable source)
   {
       int[] sorted = source.OrderBy(x => x).ToArray();
       int count = sorted.Length;

       if (count == 0)
       {
           throw new InvalidOperationException("The collection is empty.");
       }

       if (count % 2 == 0)
       {
           return (sorted[count / 2 - 1] + sorted[count / 2]) / 2.0;
       }
       else
       {
           return sorted[count / 2];
       }
   }
}
public static class EnumerableExtensions
{
   public static double Median(this IEnumerable source)
   {
       int[] sorted = source.OrderBy(x => x).ToArray();
       int count = sorted.Length;

       if (count == 0)
       {
           throw new InvalidOperationException("The collection is empty.");
       }

       if (count % 2 == 0)
       {
           return (sorted[count / 2 - 1] + sorted[count / 2]) / 2.0;
       }
       else
       {
           return sorted[count / 2];
       }
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

使用此擴充方法,您可以輕鬆找到集合的中位數值:

int[] numbers = { 5, 3, 9, 1, 4 };
double median = numbers.Median();
Console.WriteLine($"The median value is {median}."); // The median value is 4.
int[] numbers = { 5, 3, 9, 1, 4 };
double median = numbers.Median();
Console.WriteLine($"The median value is {median}."); // The median value is 4.
Dim numbers() As Integer = { 5, 3, 9, 1, 4 }
Dim median As Double = numbers.Median()
Console.WriteLine($"The median value is {median}.") ' The median value is 4.
VB   C#

DateTime 擴充方法 StartOfWeek

假設您想找到給定日期的一周的開始。 您可以為 DateTime 結構創建擴充方法:

public static class DateTimeExtensions
{
   public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek = DayOfWeek.Monday)
   {
       int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
       return dt.AddDays(-1 * diff).Date;
   }
}
public static class DateTimeExtensions
{
   public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek = DayOfWeek.Monday)
   {
       int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
       return dt.AddDays(-1 * diff).Date;
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

現在,您可以輕鬆找到任何日期的週開始:

DateTime today = DateTime.Today;
DateTime startOfWeek = today.StartOfWeek();
Console.WriteLine($"The start of the week is {startOfWeek.ToShortDateString()}."); // The start of the week is 17/06/2024.
DateTime today = DateTime.Today;
DateTime startOfWeek = today.StartOfWeek();
Console.WriteLine($"The start of the week is {startOfWeek.ToShortDateString()}."); // The start of the week is 17/06/2024.
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

使用 IronPDF 和擴展方法生成 PDF 文件

在本節中,我們將介紹IronPDF,我們業界領先的用於生成和處理C#中的PDF文件的庫。 我們也將探討如何利用擴充方法來創造一個更無縫且直觀的體驗,當使用此程式庫時。

IronPDF將HTML轉換為PDF,並保留內容在網頁瀏覽器中顯示的版面佈局和樣式。 該庫可以處理來自文件、URL 和字串的原始 HTML。 以下是快速概覽:

using IronPdf;

class Program
{
   static void Main(string[] args)
   {
       var renderer = new ChromePdfRenderer();

       // 1. Convert HTML String to PDF
       var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
       var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
       pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

       // 2. Convert HTML File to PDF
       var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
       var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
       pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

       // 3. Convert URL to PDF
       var url = "http://ironpdf.com"; // Specify the URL
       var pdfFromUrl = renderer.RenderUrlAsPdf(url);
       pdfFromUrl.SaveAs("URLToPDF.pdf");
   }
}
using IronPdf;

class Program
{
   static void Main(string[] args)
   {
       var renderer = new ChromePdfRenderer();

       // 1. Convert HTML String to PDF
       var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
       var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
       pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

       // 2. Convert HTML File to PDF
       var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
       var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
       pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

       // 3. Convert URL to PDF
       var url = "http://ironpdf.com"; // Specify the URL
       var pdfFromUrl = renderer.RenderUrlAsPdf(url);
       pdfFromUrl.SaveAs("URLToPDF.pdf");
   }
}
Imports IronPdf

Friend Class Program
   Shared Sub Main(ByVal args() As String)
	   Dim renderer = New ChromePdfRenderer()

	   ' 1. Convert HTML String to PDF
	   Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
	   Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
	   pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

	   ' 2. Convert HTML File to PDF
	   Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
	   Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
	   pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

	   ' 3. Convert URL to PDF
	   Dim url = "http://ironpdf.com" ' Specify the URL
	   Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
	   pdfFromUrl.SaveAs("URLToPDF.pdf")
   End Sub
End Class
VB   C#

創建簡單的 PDF

在我們深入擴展方法之前,讓我們看看如何使用 IronPDF 從 HTML 創建一個簡單的 PDF:

using IronPdf;

class Program
{
   static void Main(string[] args)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderHtmlAsPdf("Hello, World!");
       PDF.SaveAs("HelloWorld.PDF");
   }
}
using IronPdf;

class Program
{
   static void Main(string[] args)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderHtmlAsPdf("Hello, World!");
       PDF.SaveAs("HelloWorld.PDF");
   }
}
Imports IronPdf

Friend Class Program
   Shared Sub Main(ByVal args() As String)
	   Dim renderer = New ChromePdfRenderer()
	   Dim PDF = renderer.RenderHtmlAsPdf("Hello, World!")
	   PDF.SaveAs("HelloWorld.PDF")
   End Sub
End Class
VB   C#

以下程式碼片段建立了一個包含文字 "Hello, World" 的 PDF。!並將其保存為名為 "HelloWorld.PDF" 的文件。

IronPDF 的擴充方法

現在,讓我們來探索如何使用擴充方法來增強IronPDF的功能,使其更易於使用。 例如,我們可以創建一個擴展方法,該方法接受字串類的實例並直接從中生成 PDF。

public static class StringExtensions
{
   public static void SaveAsPdf(this string htmlContent, string filePath)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderHtmlAsPdf(htmlContent);
       PDF.SaveAs(filePath);
   }
}
public static class StringExtensions
{
   public static void SaveAsPdf(this string htmlContent, string filePath)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderHtmlAsPdf(htmlContent);
       PDF.SaveAs(filePath);
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

透過此擴展方法,我們現在可以直接從字串生成 PDF:

string html = "Extension Methods and IronPDFGenerating PDFs has never been easier!";
html.SaveAsPdf("ExtensionMethodsAndIronPDF.PDF");
string html = "Extension Methods and IronPDFGenerating PDFs has never been easier!";
html.SaveAsPdf("ExtensionMethodsAndIronPDF.PDF");
Dim html As String = "Extension Methods and IronPDFGenerating PDFs has never been easier!"
html.SaveAsPdf("ExtensionMethodsAndIronPDF.PDF")
VB   C#

從網址生成 PDF

另一個有用的擴展方法是創建一個從 URL 生成 PDF 的方法。 我們可以擴展 Uri 類來實現這一點:

public static class UriExtensions
{
   public static void SaveAsPdf(this Uri url, string filePath)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderUrlAsPdf(url.AbsoluteUri);
       PDF.SaveAs(filePath);
   }
}
public static class UriExtensions
{
   public static void SaveAsPdf(this Uri url, string filePath)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderUrlAsPdf(url.AbsoluteUri);
       PDF.SaveAs(filePath);
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

現在,我們可以輕鬆地從這樣的 URL 生成 PDF:

Uri url = new Uri("https://www.ironpdf.com/");
url.SaveAsPdf("UrlToPdf.PDF");
Uri url = new Uri("https://www.ironpdf.com/");
url.SaveAsPdf("UrlToPdf.PDF");
Dim url As New Uri("https://www.ironpdf.com/")
url.SaveAsPdf("UrlToPdf.PDF")
VB   C#

結論

於是,我們探討了C#中的擴展方法概念,學會了如何使用靜態方法和靜態類實現它們,並舉例說明了不同類型的實際運用。此外,我們介紹了IronPDF,一個用於在C#中生成和處理PDF文件的庫。 當您開始一起使用擴充方法和IronPDF時,您將會發現您的程式碼可以變得更簡潔、更易讀且更高效。

準備好動手使用IronPDF了嗎? 您可以從我們的IronPDF 30 天免費試用版. 它也可完全免費用於開發目的,因此您可以真正了解它的組成。 如果您喜歡所見內容,IronPDF 的起價僅為IronPDF 授權詳情 $749要獲得更大的節省,請查看Iron Software 套件的購買選項只需兩個產品的價格,你就能獲得全部九個Iron Software工具。 編碼快樂!

Csharp Extension Methods 1 related to 結論

< 上一頁
C# 中的 Try/Catch(開發者的運作方式)
下一個 >
C# 使用 (對開發者的運作方式)

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >