跳至頁尾內容
開發者更新

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"是預設值。 如果您呼叫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

在此方法中,lastName都是必需的參數。 當您呼叫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

可選參數

另一方面,可選參數允許靈活性。 它們在方法定義中設有預設值,當不包含該參數時,它們將使用該值。

例如,讓我們修改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

現在,您可以僅使用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

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提供值:

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

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

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

  1. Improved Readability:命名參數可以讓您的程式碼更易於閱讀和理解。 通過指定參數的名稱,您可以清楚地表示每個引數的意義。 在具有多個參數的方法中特別有用。
  2. Flexible Argument Order:使用命名參數,您可以以任何順序提供引數,而不必僅按照參數在方法宣告中的順序。 這可以在某些情況下使程式碼更靈活並提高可讀性。
  3. Ease with Optional Parameters:命名參數通常與可選參數一起使用。 當方法有多個可選參數時,您可以使用命名參數為部分可選參數提供值,而不是全部提供。 這樣,您不必為每個可選參數提供值,只需為那些您希望更改其預設值的參數提供值即可。

這裡是另一個使用命名參數的例子:

// 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

在上述程式碼中,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參數。

使用預設參數代替重載

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

以下是如何通過使用預設參數而不是重載重寫上述例子的方式:

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 套件

讓我們深入了解Iron Software的套件,其中包括IronPDF程式庫,用於PDF解決方案IronXL, 用於C# Excel操作IronOCR,用於高級文字識別,和IronBarcode,用於條碼生成。 這些強大的程式庫專門設計來幫助您擴展C#應用程式的功能。 它們可以輕鬆與我們在本文中討論的概念相關聯,包括預設參數、命名引數規範和方法重載。

IronPDF:這是一個C#程式庫,用於將HTML轉換為PDF,使用IronPDF。 理解預設和可選參數在使用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#的基本原理。

談到這些程式庫,請記住每個程式庫的個別授權起始自$999,這些程式庫還提供Iron Software產品的免費試用。 但是,Iron Software提供了一個套裝交易:您可以以兩個個別授權的價格獲取整個套件。

常見問題

C#中的預設參數如何增強程式碼效率?

C#中的預設參數允許開發者為方法參數賦予預定義的值,減少多個方法重載的需求,簡化程式碼的維護。

預設參數可以與C#中的具名參數一起使用嗎?

可以,C#中的預設參數可以與具名參數結合使用,允許開發者僅按名稱指定必要的參數,改善程式碼的可讀性和靈活性。

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

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

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

方法重載涉及建立多個名稱相同但參數不同的方法,而預設參數允許單一方法通過提供省略參數的備援值來處理多個情境。

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

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

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

在IronPDF中,預設參數可以通過允許開發者調整例如HTML內容或檔案路徑等設定項目而不需指定每個參數,從而高效地自訂輸出來簡化PDF生成。

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

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

為什麼掌握預設參數對於開發者來說至關重要?

掌握預設參數至關重要,因為它透過在方法呼叫中提供靈活性來提升編程效率,確保提供必要的資料並簡化程式碼結構。

Jacob Mellor,首席技術官 @ Team Iron
首席技術官

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話