跳至页脚内容
.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 Suite

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# 库,用于 将 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# 的基础。

说到这些库,请记住每个的个人许可证从 $799 开始,而这些库还提供 Iron Software 产品的免费试用版。 然而,Iron Software 提供了一种套餐交易:您可以以仅 购买两个个人许可证的价格获取整个套件。

常见问题解答

默认参数如何提高 C# 中的代码效率?

C# 中的默认参数允许开发人员为方法参数分配预定义值,从而减少多个方法重载的需求并简化代码维护。

默认参数可以与 C# 中的命名参数一起使用吗?

可以,默认参数可以与 C# 中的命名参数结合使用,允许开发人员按名称仅指定所需的参数,从而提高代码的可读性和灵活性。

使用可选参数的好处是什么?

C# 中的可选参数通过允许方法调用省略某些参数(这些参数默认为预定义的值)提供灵活性,从而简化方法调用并减少代码冗余。

方法重载与在 C# 中使用默认参数有何不同?

方法重载涉及创建多个具有相同名称但不同参数的方法,而默认参数通过为省略的参数提供备用值来允许单个方法处理多种情况。

使用 C# 中的默认参数时应遵循哪些规则?

关键规则包括确保默认值是常量表达式,将可选参数放在必需参数之后,以及使用命名参数指定省略的参数。

默认参数如何优化 IronPDF 库的使用?

在 IronPDF 中,默认参数可以通过允许开发人员在不指定每个参数的情况下调整 HTML 内容或文件路径等设置来简化 PDF 生成,从而有效地定制输出。

命名参数在提高代码可读性方面起什么作用?

命名参数允许按名称而不是位置指定参数,使代码更加可读,并减少与参数顺序相关的错误。

掌握默认参数对开发人员为何至关重要?

掌握默认参数是至关重要的,因为它通过在方法调用中提供灵活性来提高编程效率,确保提供必要的数据并简化代码结构。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。