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

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

让我们深入了解 Iron 软件套件,其中包括 IronPDF, IronXL, IronOCRIronBarcode.这些功能强大的库专门用于帮助您扩展 C# 应用程序的功能。它们很容易与我们在文章中讨论的概念联系起来,包括默认参数、命名参数规范和方法重载。

IronPDF: 这是一个 C# 库,用于 将 HTML 转换为 PDF.在使用 IronPDF 时,了解默认参数和可选参数至关重要。IronPDF 中的许多方法都有可选参数,这些参数允许在不使方法签名过于复杂的情况下进行广泛的自定义。有关这方面的更多信息,请参阅 IronPDF HTML 转 PDF 教程 page.

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: 先进的光学字符识别功能 (光学字符识别) IronOCR 库可以在 C# 应用程序中读取图像和 PDF 中的文本和条形码。IronOCR 的方法可能带有可选参数,用于控制 OCR 过程的各个方面,如文本的语言、应用的纠错级别等。了解这些参数可以让您更好地控制 OCR 过程。

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

结论

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

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

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

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

免费NuGet下载 总下载量: 10,731,156 查看许可证 >