跳過到頁腳內容
.NET幫助

C# 預設參數(開發者的工作原理)

今天,我們將深入探討 C# 的世界,學習一個強大的功能——默認參數。 我們將以易於理解的方式進行分解,重點關注 C# 中的默認參數值和可選參數的概念。

什麼是默認參數?

在 C# 中,默認參數,也稱為可選參數,允許您在方法定義中為固定參數分配一個值。 如果在調用函數時未提供該參數的參數,則將使用默認值。

默認參數值在方法定義中設置,如下面的代碼片段所示:

public void Greet(string name = "Friend")
{
    Console.WriteLine("Hello, " + name);
}
public void Greet(string name = "Friend")
{
    Console.WriteLine("Hello, " + name);
}
Public Sub Greet(Optional ByVal name As String = "Friend")
	Console.WriteLine("Hello, " & name)
End Sub
$vbLabelText   $csharpLabel

在這裡,參數name為可選屬性。 字串 "Friend" 是默認值。 如果您調用Greet()而不傳遞參數,"Friend" 將用作name的值。

必需參數和可選參數

必需參數

必需參數是調用函數或方法時必須包含的參數。 它沒有默認值,因此必須始終提供參數。 編譯器會檢查函數或方法的調用,如果未提供必需參數,則會拋出編譯時錯誤。

讓我們考慮一個示例:

// Method with required parameters
public void IntroduceYourself(string firstName, string lastName)
{
    Console.WriteLine("Hello, my name is " + firstName + " " + lastName);
}
// Method with required parameters
public void IntroduceYourself(string firstName, string lastName)
{
    Console.WriteLine("Hello, my name is " + firstName + " " + lastName);
}
' Method with required parameters
Public Sub IntroduceYourself(ByVal firstName As String, ByVal lastName As String)
	Console.WriteLine("Hello, my name is " & firstName & " " & lastName)
End Sub
$vbLabelText   $csharpLabel

在這個方法中,firstNamelastName 都是必需參數。 當您調用IntroduceYourself時,您必須為兩個參數提供值。 如果省略參數,您將收到編譯時錯誤。

IntroduceYourself("John", "Doe"); // Following call is correct
// IntroduceYourself("John"); // Error: lastName is missing
IntroduceYourself("John", "Doe"); // Following call is correct
// IntroduceYourself("John"); // Error: lastName is missing
IntroduceYourself("John", "Doe") ' Following call is correct
' IntroduceYourself("John"); // Error: lastName is missing
$vbLabelText   $csharpLabel

可選參數

另一方面,可選參數允許靈活性。 它們在方法定義中設置有默認值,當調用方法時未提供該參數時使用。

例如,讓我們修改IntroduceYourself方法,使lastName參數可選:

// Method with an optional parameter
public void IntroduceYourself(string firstName, string lastName = "Doe")
{
    Console.WriteLine("Hello, my name is " + firstName + " " + lastName);
}
// Method with an optional parameter
public void IntroduceYourself(string firstName, string lastName = "Doe")
{
    Console.WriteLine("Hello, my name is " + firstName + " " + lastName);
}
' Method with an optional parameter
Public Sub IntroduceYourself(ByVal firstName As String, Optional ByVal lastName As String = "Doe")
	Console.WriteLine("Hello, my name is " & firstName & " " & lastName)
End Sub
$vbLabelText   $csharpLabel

現在,您可以僅使用firstName參數來調用IntroduceYourself。 如果是這樣,lastName將默認為 "Doe"。

IntroduceYourself("John", "Smith"); // Outputs: Hello, my name is John Smith
IntroduceYourself("John");          // Outputs: Hello, my name is John Doe
IntroduceYourself("John", "Smith"); // Outputs: Hello, my name is John Smith
IntroduceYourself("John");          // Outputs: Hello, my name is John Doe
IntroduceYourself("John", "Smith") ' Outputs: Hello, my name is John Smith
IntroduceYourself("John") ' Outputs: Hello, my name is John Doe
$vbLabelText   $csharpLabel

當您提供可選參數時,它會覆蓋默認值。

請記住,在方法聲明中,必需參數必須始終列在可選參數之前。

理解區別

必需參數和可選參數之間的區別很重要,因為它影響您如何調用方法。 可選參數提供靈活性,允許在不需要時跳過特定參數的輸入。 另一方面,必需參數確保對函數或方法始終提供必要的數據,有助於防止運行時錯誤。

使用默認參數的規則

在定義具有默認參數的方法時,請記住幾個關鍵規則:

  1. 默認值必須是常量表達式。 不能使用變量或方法調用。
  2. 所有可選參數必須在任何必需參數之後定義於參數列表的末尾。
  3. 當您調用一個具有可選參數的方法時,您可以按照它們定義的順序提供所省略的可選參數的參數,也可以使用命名參數。
  4. 如果未提供可選參數值,則將使用默認值。

請參考以下可選參數的代碼片段:

static void Main(string[] args)
{
    ShowMessage("Hello");
    ShowMessage("Hello", "John");
}

public static void ShowMessage(string msg, string name = "Friend")
{
    Console.WriteLine(msg + ", " + name);
}
static void Main(string[] args)
{
    ShowMessage("Hello");
    ShowMessage("Hello", "John");
}

public static void ShowMessage(string msg, string name = "Friend")
{
    Console.WriteLine(msg + ", " + name);
}
Shared Sub Main(ByVal args() As String)
	ShowMessage("Hello")
	ShowMessage("Hello", "John")
End Sub

Public Shared Sub ShowMessage(ByVal msg As String, Optional ByVal name As String = "Friend")
	Console.WriteLine(msg & ", " & name)
End Sub
$vbLabelText   $csharpLabel

Main 方法中,我們調用了 ShowMessage 兩次。第一次我們只傳遞了一個參數,因此 name 參數使用了其默認值 "Friend"。 第二次我們傳遞了兩個參數,因此使用 "John" 而不是默認值。

命名和可選參數

C# 還支持命名和可選參數。 命名參數允許您根據名稱而非位置為參數指定值。 當一個方法有多個可選參數時,這可能很有幫助,而您只想為當中的一個參數提供值。

在以下示例中,ShowGreetings 擁有兩個可選參數:

public static void ShowGreetings(string greeting = "Hello", string name = "Friend")
{
    Console.WriteLine(greeting + ", " + name);
}
public static void ShowGreetings(string greeting = "Hello", string name = "Friend")
{
    Console.WriteLine(greeting + ", " + name);
}
Public Shared Sub ShowGreetings(Optional ByVal greeting As String = "Hello", Optional ByVal name As String = "Friend")
	Console.WriteLine(greeting & ", " & name)
End Sub
$vbLabelText   $csharpLabel

我們可以僅用第一個參數調用此方法:

ShowGreetings("Hi");
ShowGreetings("Hi");
ShowGreetings("Hi")
$vbLabelText   $csharpLabel

或者我們可以使用命名參數為name提供值,而省略greeting參數:

ShowGreetings(name: "John");
ShowGreetings(name: "John");
ShowGreetings(name:= "John")
$vbLabelText   $csharpLabel

使用命名參數有什麼好處?

C# 中的命名參數提供了多項好處:

  1. 提高可讀性:命名參數可以使您的代碼更易於閱讀和理解。 透過指定參數的名稱,您可以清楚地表示每個參數的意義。 這對於具有多個參數的方法特別有益。
  2. 靈活的參數順序:使用命名參數,您可以以任意順序提供參數,而不僅僅是方法聲明中參數的順序。 這可以使您的代碼更具靈活性,並在某些情況下提高可讀性。
  3. 與可選參數的便利性:命名參數通常用於可選參數。 當方法有多個可選參數時,您可以使用命名參數為部分可選參數提供值,而不是為所有可選參數提供值。 這樣,您只需要為您想要從默認值變更的參數提供值。

以下是命名參數用法的另一個示例:

// Method Declaration
public void RegisterUser(string username, string password, string email = "", bool subscribeToNewsletter = false)
{
    // Method body
}

// Method Call
RegisterUser(username: "JohnDoe", password: "password123", subscribeToNewsletter: true);
// Method Declaration
public void RegisterUser(string username, string password, string email = "", bool subscribeToNewsletter = false)
{
    // Method body
}

// Method Call
RegisterUser(username: "JohnDoe", password: "password123", subscribeToNewsletter: true);
' Method Declaration
Public Sub RegisterUser(ByVal username As String, ByVal password As String, Optional ByVal email As String = "", Optional ByVal subscribeToNewsletter As Boolean = False)
	' Method body
End Sub

' Method Call
RegisterUser(username:= "JohnDoe", password:= "password123", subscribeToNewsletter:= True)
$vbLabelText   $csharpLabel

在上述代碼中,email 是一個被省略的可選參數,而我們選擇將subscribeToNewsletter設置為true,即便它是列表中的最後一個參數。使用命名參數可以清楚地表示每個參數的意義,並讓我們僅指定想要提供的參數。

默認參數和方法重載

什麼是方法重載?

在 C# 中,方法重載或函數重載是一種允許您定義多個相同名稱但具有不同參數的方法的功能。 這允許您使用相同的方法名執行不同的操作,使您的代碼更直觀且易於使用。

考慮以下重載方法的代碼範例:

public void DisplayMessage(string message)
{
    Console.WriteLine(message);
}

public void DisplayMessage(string message, string name)
{
    Console.WriteLine(message + ", " + name);
}
public void DisplayMessage(string message)
{
    Console.WriteLine(message);
}

public void DisplayMessage(string message, string name)
{
    Console.WriteLine(message + ", " + name);
}
Public Sub DisplayMessage(ByVal message As String)
	Console.WriteLine(message)
End Sub

Public Sub DisplayMessage(ByVal message As String, ByVal name As String)
	Console.WriteLine(message & ", " & name)
End Sub
$vbLabelText   $csharpLabel

在上述示例中,方法 DisplayMessage 被重載。 方法的一個版本接受一個 string 參數,另一個版本則接受兩個 string 參數。

使用默認參數代替重載

默認參數通常可以作為重載的替代方案。 通過為方法的參數提供默認值,可以允許調用者選擇是否提供該參數。 這可以為您的方法提供與方法重載相同的靈活性,但代碼更少。

以下是如何使用默認參數重寫上述示例:

public void DisplayMessage(string message, string name = "Friend")
{
    Console.WriteLine(message + ", " + name);
}
public void DisplayMessage(string message, string name = "Friend")
{
    Console.WriteLine(message + ", " + name);
}
Public Sub DisplayMessage(ByVal message As String, Optional ByVal name As String = "Friend")
	Console.WriteLine(message & ", " & name)
End Sub
$vbLabelText   $csharpLabel

現在,DisplayMessage 可以接收一個或兩個參數:

DisplayMessage("Hello");
DisplayMessage("Hello", "John");
DisplayMessage("Hello");
DisplayMessage("Hello", "John");
DisplayMessage("Hello")
DisplayMessage("Hello", "John")
$vbLabelText   $csharpLabel

在第一次調用中,name 參數使用其默認值 "Friend"。 在第二次調用中,使用提供的參數 "John" 替代。

請記住,默認參數的默認值必須是常量表達式,這意味著它不能是變量或方法調用。 因為該值需要在編譯時已知。

Iron Software 套件

Let's dive into the Iron Software suite, which includes IronPDF library for PDF solutions, IronXL for C# Excel operations, IronOCR for advanced text recognition, and IronBarcode for barcode generation. 這些功能強大的庫專門設計用於幫助您擴展 C# 應用程序的功能。 它們可以輕鬆關聯到我們在本文中討論的概念,包括默認參數、命名參數規範和方法重載。

IronPDF: 這是一個 C# 庫,用於使用 IronPDF 將 HTML 轉換為 PDF。 在使用 IronPDF 時,理解默認和可選參數可能至關重要。 IronPDF 中的許多方法都有可選參數,允許進行廣泛的自定義而不會使方法簽名過於複雜。 更多內容可以在 IronPDF HTML 到 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");
    }
}
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
$vbLabelText   $csharpLabel

IronXL: 這個庫允許您的 C# 應用程序以多種格式讀取、寫入和處理 Excel 文件。 IronXL 中的方法可能具有不同的參數,例如保存文件的格式或導入數據時是否包含標題。 您可能還會發現命名和可選參數被廣泛用於指定單元範圍、格式選項等。
IronOCR: 一個先進的光學字符識別 (OCR) 庫,可以從 C# 應用程序中的圖像和 PDF 中讀取文本和條形碼。 IronOCR 的方法可能會提供可選參數來控制 OCR 過程的各個方面,例如文本的語言、應用的錯誤更正級別等。 理解這些參數可以讓您更好地控制 OCR 過程。
IronBarcode: 這個庫是一個多功能的工具,用於在 .NET 應用程序中讀取和生成條形碼。 在這裡,理解默認參數同樣是關鍵。 例如,當生成條形碼時,您可能會有可選參數來指定條形碼的大小、格式或值。

結論

總之,掌握 C# 中默認和可選參數的使用可以顯著提升您的編程效率和代碼的多才多藝。 這些概念是 C# 的基礎。

談到這些庫,請記得每個庫的個人許可證價格從$799開始,這些庫還提供Iron Software 產品的免費試用。 然而,Iron Software 提供了一套組合方案:您可以用兩個個人許可證的價格購得整個套件。

常見問題解答

預設參數如何在 C# 中提高程式碼效率?

C# 中的預設參數允許開發人員為方法參數分配預定義的值,減少需要多重方法重載的必要性,並簡化程式碼維護。

預設參數可以與命名參數一起使用嗎?

可以,C# 中可以將預設參數與命名參數結合使用,允許開發人員僅通過名稱指定必要的參數,提高程式碼的可讀性和靈活性。

使用可選參數在 C# 中有什麼好處?

C# 中的可選參數提供靈活性,允許方法呼叫省略某些參數,這些參數將默認為預定義的值,簡化方法呼叫並減少程式碼冗余。

方法重載與使用預設參數在 C# 中有何不同?

方法重載涉及創建多個具有相同名稱但不同參數的方法,而預設參數允許單一方法通過為省略的參數提供替代值來處理多個場景。

使用預設參數時應遵循哪些規則?

關鍵規則包括確保預設值為常量表達式,將可選參數放在必需參數之後,並使用命名參數指定省略的參數。

預設參數如何優化 IronPDF 庫的使用?

在 IronPDF 中,預設參數可以通過允許開發人員調整如 HTML 內容或文件路徑等設置來簡化 PDF 的生成,而無需指定每一個參數,從而高效地自定義輸出。

命名參數在提高程式碼可讀性方面起什麼作用?

命名參數允許通過名稱而非位置指定參數,這使得程式碼更易讀,並減少因參數順序出錯的機會。

為何掌握預設參數對開發人員至關重要?

掌握預設參數至關重要,因為它提高了編程效率,通過提供方法呼叫中的靈活性確保必要數據供應,並簡化程式碼結構。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。