.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的值。

必填参数和可选参数

所需参数

必填参数是指在调用函数或方法时必须包含的参数。 它没有默认值,因此必须始终提供一个参数。 编译器会检查函数或方法的调用,如果没有提供所需的参数,就会在编译时出错。

让我们来看一个例子:

//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
$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参数变为可选:

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

在静态 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
$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 软件套件

让我们深入了解Iron Software套件,其中包括用于PDF解决方案的IronPDF库用于C# Excel操作的IronXL高级文本识别的IronOCR,以及用于条形码生成的IronBarcode。 这些功能强大的库专门用于帮助您扩展 C# 应用程序的功能。 这些术语很容易与我们在文章中讨论的概念联系起来,包括默认参数、命名参数规范和方法重载。

IronPDF: 这是一个用于将HTML转换为PDF的C#库,使用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# 的基础。

说到这些库,请记住每个库的单独许可证起价为$749,而这些库也提供 Iron Software 产品的免费试用。 不过,Iron Software 提供一揽子优惠:您只需支付两个单独许可证的价格,即可获得整个套件。

Chipego
软件工程师
Chipego 拥有出色的倾听技巧,这帮助他理解客户问题并提供智能解决方案。他在 2023 年加入 Iron Software 团队,此前他获得了信息技术学士学位。IronPDF 和 IronOCR 是 Chipego 主要专注的两个产品,但他对所有产品的了解每天都在增长,因为他不断找到支持客户的新方法。他喜欢 Iron Software 的合作氛围,公司各地的团队成员贡献他们丰富的经验,以提供有效的创新解决方案。当 Chipego 离开办公桌时,你经常可以发现他在看书或踢足球。
< 前一页
C# 和(它如何为开发人员工作)
下一步 >
C# 字典 TryGetValue(开发人员如何使用)