.NET 帮助

C# 默认参数(开发人员工作原理)

发布 2023年八月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#

在此方法中,"firstName "和 "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
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 软件套件

让我们深入了解 Iron Software Suite,其中包括IronPDF 库的 PDF 解决方案, IronXL for 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 中的文本和 BarCode。 IronOCR 的方法可能有可选参数,用于控制 OCR 过程的各个方面,如文本的语言、应用的纠错级别等。 了解这些参数可以让您更好地控制 OCR 流程。

IronBarcode: 该库是在 .NET 应用程序中读取和生成条形码的多功能工具。 在这里,理解默认参数也至关重要。 例如,在生成条形码时,您可能会有可选参数来指定条形码的大小、格式或值。

结论

总之,掌握 C# 中默认参数和可选参数的使用方法可以大大提高您的编程效率和代码的通用性。 这些概念是 C# 的基础。

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

< 前一页
C# 和(它如何为开发人员工作)
下一步 >
C# 字典 TryGetValue(开发人员如何使用)

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,781,565 查看许可证 >