.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#

在靜態的 void 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 Suite

讓我們深入了解Iron Software套件,其中包括 IronPDF, IronXL, IronOCR,和 IronBarcode. 這些強大的庫專門為幫助您擴展 C# 應用程序的功能而設計。它們可以很容易地與我們文章中討論的概念相關聯,包括默認參數、命名參數規範和方法重載。

IronPDF: 這是一個用於 C# 的庫 將 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# 的基礎。

談到這些庫,請記住每個庫的個別許可證價格從 $liteLicense 開始,這些庫還提供 免費試用然而,Iron Software 提供一個優惠方案:您可以用兩個單獨授權的價格獲取整個套件。

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

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

免費 NuGet 下載 總下載次數: 10,993,239 查看許可證 >