跳過到頁腳內容
.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# 中,方法重載 (method overloading) 或函數重載 (function overload) 是一種功能,可讓您定義多個名稱相同但參數不同的方法。 這可讓您使用相同的方法名稱執行不同的作業,讓您的程式碼更直覺、更容易使用。

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

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 Suite

讓我們深入瞭解 Iron Software 套件,其中包括適用於 PDF 解決方案的 IronPDF 函式庫、適用於 C# Excel 操作的 IronXL、適用於進階文字辨識的 IronOCR,以及適用於條碼產生的 IronBarcode。 這些功能強大的函式庫是專門設計來幫助您擴充 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 中的文字和 BarCode。 IronOCR 的方法可能具有可選參數,用於控制 OCR 過程的各個方面,例如文字的語言、應用的糾錯程度等。 瞭解這些參數可以讓您更好地控制 OCR 流程。
IronBarcode:這個函式庫是在 .NET 應用程式中讀取和產生條碼的多功能工具。 在此,理解預設參數也是至關重要的。 例如,在產生條碼時,您可能會有可選參數來指定條碼的大小、格式或數值。

結論

總而言之,掌握 C# 中預設參數和可選參數的使用,可以大幅提升您的程式設計效率和程式碼的多樣性。 這些概念是 C# 的基本概念。

談到這些函式庫,請記住每個函式庫的個別授權都是從 $799 開始,而且這些函式庫也提供 免費試用 Iron Software 產品的服務。 不過,Iron Software 提供套裝交易:您只需花費兩個個別授權的價格,即可取得整個套件。

常見問題解答

預設參數如何提升 C# 的程式碼效率?

C# 中的預設參數允許開發人員為方法參數指定預定義的值,從而減少對多個方法重載的需求,並簡化程式碼維護。

在 C# 中,預設參數可以與命名參數一起使用嗎?

是的,在 C# 中,預設參數可與命名參數結合,讓開發人員只需透過名稱指定必要的參數,增強程式碼的可讀性和彈性。

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

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

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

方法重載(Method overloading)是指建立具有相同名稱但不同參數的多個方法,而預設參數則允許單一方法透過為省略的參數提供後備值來處理多種情況。

在 C# 中使用預設參數時應遵循哪些規則?

主要規則包括:確保預設值為常量表達式、將可選參數置於必須參數之後,以及使用命名的參數指定省略的參數。

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

在 IronPdf 中,預設參數可以讓開發人員調整 HTML 內容或檔案路徑等設定,而無需指定每個參數,進而有效自訂輸出,從而簡化 PDF 的產生。

命名參數在改善程式碼可讀性方面扮演什麼角色?

命名參數允許以名稱而非位置指定參數,使程式碼更具可讀性,並減少與參數順序相關的錯誤。

為什麼掌握預設參數對開發人員而言至關重要?

掌握預設參數是至關重要的,因為它可以提供方法呼叫的靈活性、確保提供必要的資料,並簡化程式碼的結構,進而提升程式設計的效率。

Jacob Mellor, Team Iron 首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技術官,作為 C# PDF 技術的先鋒工程師。作為 Iron Software 核心代碼的原作者,他自開始以來塑造了公司產品架構,與 CEO Cameron Rimington 一起將其轉變為一家擁有超過 50 名員工的公司,為 NASA、特斯拉 和 全世界政府機構服務。

Jacob 持有曼徹斯特大學土木工程一級榮譽学士工程學位(BEng) (1998-2001)。他於 1999 年在倫敦開設了他的第一家軟件公司,並於 2005 年製作了他的首個 .NET 組件,專注於解決 Microsoft 生態系統內的複雜問題。

他的旗艦產品 IronPDF & Iron Suite .NET 庫在全球 NuGet 被安裝超過 3000 萬次,其基礎代碼繼續為世界各地的開發工具提供動力。擁有 25 年的商業經驗和 41 年的編碼專業知識,Jacob 仍專注於推動企業級 C#、Java 及 Python PDF 技術的創新,同時指導新一代技術領袖。