.NET 幫助

C# 預設參數(開發者如何運作)

發佈 2023年8月29日
分享:

今天,我們將深入 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
VB   C#

這裡,參數 name 是一個可選屬性。 字串 "Friend" 是預設值。 如果您呼叫 Greet()如果不傳遞參數,將使用「Friend」作為name` 的值。

必需參數和可選參數

必需參數

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

讓我們考慮一個例子:

//pass arguments in the same order
public void IntroduceYourself(string firstName, string lastName)
{
    Console.WriteLine("Hello, my name is " + firstName + " " + lastName);
}
//pass arguments in the same order
public void IntroduceYourself(string firstName, string lastName)
{
    Console.WriteLine("Hello, my name is " + firstName + " " + lastName);
}
'pass arguments in the same order
Public Sub IntroduceYourself(ByVal firstName As String, ByVal lastName As String)
	Console.WriteLine("Hello, my name is " & firstName & " " & lastName)
End Sub
VB   C#

在此方法中,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
VB   C#

可選參數

另一方面,可選參數允許靈活性。 他們在方法定義中設置了預設值,當調用該方法而不傳遞該參數時使用該預設值。

例如,我們將修改 IntroduceYourself 方法,使 lastName 參數成為可選的:

//named arguments
public void IntroduceYourself(string firstName, string lastName = "Doe")
{
    Console.WriteLine("Hello, my name is " + firstName + " " + lastName);
}
//named arguments
public void IntroduceYourself(string firstName, string lastName = "Doe")
{
    Console.WriteLine("Hello, my name is " + firstName + " " + lastName);
}
'named arguments
Public Sub IntroduceYourself(ByVal firstName As String, Optional ByVal lastName As String = "Doe")
	Console.WriteLine("Hello, my name is " & firstName & " " & lastName)
End Sub
VB   C#

現在,您可以只使用 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
VB   C#

當您提供可選參數時,它將覆蓋預設值。

請記住,在方法宣告中,必須先列出必填參數,再列出選填參數。

瞭解差異

區分必需或命名參數與可選參數具有重要意義,因為這會影響你如何調用方法。 可選參數提供靈活性,讓您在不需要特定參數時略過輸入。 另一方面,必需的參數確保總是將必要的數據提供給函數或方法,有助於防止運行時錯誤。

使用預設參數的規則

在定義具有預設參數的方法時,需要記住幾個關鍵規則:

  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
VB   C#

在靜態的 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
VB   C#

我們可以只使用第一個參數調用這個方法:

ShowGreetings("Hi");
ShowGreetings("Hi");
ShowGreetings("Hi")
VB   C#

或者我們可以使用具名參數來提供 name 的值,同時省略 greeting 參數:

ShowGreetings(name: "John");
ShowGreetings(name: "John");
ShowGreetings(name:= "John")
VB   C#

使用具名參數的好處是什麼?

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)
VB   C#

在上述程式碼中,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
VB   C#

在上述範例中,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
VB   C#

現在,可以用一或兩個參數來呼叫 DisplayMessage:

DisplayMessage("Hello");
DisplayMessage("Hello", "John");
DisplayMessage("Hello");
DisplayMessage("Hello", "John");
DisplayMessage("Hello")
DisplayMessage("Hello", "John")
VB   C#

在第一次調用中,name 參數使用其預設值 "Friend"。 在第二次調用中,取而代之地使用提供的參數 "John"。

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

Iron Software 套件

讓我們深入了解Iron Software套件,其包含IronPDF 庫的 PDF 解決方案, IronXL 用於 C# 的 Excel 操作, 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
VB   C#

IronXL:該函式庫允許您的C#應用程式讀取、寫入及操作各種格式的Excel檔案。 IronXL 中的方法可能有不同的參數,例如用於保存文件的格式,或在導入數據時是否包含標題。 您可能還會發現,命名和可選參數被廣泛用於指定儲存格範圍、格式選項等。

IronOCR:先進的光學字符識別(光學字符識別)可在您的C#應用程式中從圖像和PDF讀取文字和條碼的庫。 IronOCR的方法可能有可选参数,用于控制OCR过程的各个方面,例如文本的语言、应用的错误修正等级等等。 了解這些參數可以讓您更好地控制 OCR 過程。

IronBarcode:這個庫是一個多功能工具,用於在 .NET 應用程式中讀取和生成條碼。 在這裡,了解預設參數也是至關重要的。 例如,在生成條碼時,您可能有可選參數來指定條碼的大小、格式或值。

結論

總結來說,精通在 C# 中使用預設和可選參數可以顯著提高您的編程效率和代碼的多樣性。 這些概念是 C# 的基礎。

說到這些庫,請記住每個庫的個人授權費用從 $749 開始,這些庫還提供一個Iron Software 產品的免費試用. 然而,Iron Software 提供一個套裝優惠:您可以僅用兩個單獨授權的價格獲得整個套件。

< 上一頁
C# 及 (它如何為開發者工作)
下一個 >
C# 字典 Trygetvalue(它對開發者的運作方式)

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

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