跳至页脚内容
.NET 帮助

C# Params(开发人员如何使用)

C#中的params关键字是.NET中的一个强大功能,允许方法接受可变数量的参数。 这可以显著简化调用需要不同数量参数的方法时的语法。 在本综合指南中,我们将探讨C#中的params关键字、其语法、使用案例和最佳实践。 Later in this article, we will introduce the IronPDF library from Iron Software and explain how to use the params keyword and IronPDF to generate PDFs.

C#的Params参数类型是什么?

在C#的范围内,方法通常遵循一套预定的参数。 尽管如此,仍然存在一些情况,您可能会不确定特定方法所需的参数数量。 由此引入“params”关键字,其解决方案允许指定可以容纳一系列参数的方法参数。 在开发者不确定确切参数数量的情况下,这一功能证明是无价的,它有助于在方法声明中传递不确定或可选数量的同类型参数。

public class ParamsExample
{
    // Method accepting a variable number of string arguments using the params keyword
    public void PrintMessages(params string[] messages)
    {
        foreach (var message in messages)
        {
            Console.WriteLine(message);
        }
    }
}

// Usage
class Program
{
    public static void Main()
    {
        var example = new ParamsExample();
        example.PrintMessages("Hello", "World", "!");
    }

    // More examples
    public static void AddItemsToShoppingBasket(params string[] items)
    {
        // Implementation to add items to a shopping basket
    }

    public static void AddItemsSumToShoppingBasket(params int[] sum) // Using params with int
    {
        // Implementation to add sum of items to the shopping basket
    }
}
public class ParamsExample
{
    // Method accepting a variable number of string arguments using the params keyword
    public void PrintMessages(params string[] messages)
    {
        foreach (var message in messages)
        {
            Console.WriteLine(message);
        }
    }
}

// Usage
class Program
{
    public static void Main()
    {
        var example = new ParamsExample();
        example.PrintMessages("Hello", "World", "!");
    }

    // More examples
    public static void AddItemsToShoppingBasket(params string[] items)
    {
        // Implementation to add items to a shopping basket
    }

    public static void AddItemsSumToShoppingBasket(params int[] sum) // Using params with int
    {
        // Implementation to add sum of items to the shopping basket
    }
}
Public Class ParamsExample
	' Method accepting a variable number of string arguments using the params keyword
	Public Sub PrintMessages(ParamArray ByVal messages() As String)
		For Each message In messages
			Console.WriteLine(message)
		Next message
	End Sub
End Class

' Usage
Friend Class Program
	Public Shared Sub Main()
		Dim example = New ParamsExample()
		example.PrintMessages("Hello", "World", "!")
	End Sub

	' More examples
	Public Shared Sub AddItemsToShoppingBasket(ParamArray ByVal items() As String)
		' Implementation to add items to a shopping basket
	End Sub

	Public Shared Sub AddItemsSumToShoppingBasket(ParamArray ByVal sum() As Integer) ' Using params with int
		' Implementation to add sum of items to the shopping basket
	End Sub
End Class
$vbLabelText   $csharpLabel

AddItemsToShoppingBasket方法可以使用不同数量的字符串参数进行调用。 params关键字通过允许开发者直接传递可选参数,而无需显式创建数组输入,从而简化了方法调用语法。

class Program
{
    public static void Main()
    {
        AddItemsToShoppingBasket("cake", "pizza", "cold drink");
        AddItemsToShoppingBasket("snacks", "burger");
        AddItemsToShoppingBasket(); // Valid even with zero parameters, using default value
    }
}
class Program
{
    public static void Main()
    {
        AddItemsToShoppingBasket("cake", "pizza", "cold drink");
        AddItemsToShoppingBasket("snacks", "burger");
        AddItemsToShoppingBasket(); // Valid even with zero parameters, using default value
    }
}
Friend Class Program
	Public Shared Sub Main()
		AddItemsToShoppingBasket("cake", "pizza", "cold drink")
		AddItemsToShoppingBasket("snacks", "burger")
		AddItemsToShoppingBasket() ' Valid even with zero parameters, using default value
	End Sub
End Class
$vbLabelText   $csharpLabel

考虑事项和最佳实践

  • 将Params放在参数列表的结尾: 推荐的最佳实践是将params参数放在方法参数列表的最后。这一实践促进了清晰度,从而在方法调用时减少混乱。 需要明确值的参数应在params前面以便有效组织。

  • 明确指定非params参数: 使用params时调用方法时,确保为非params参数明确提供值。 这种做法防止了模棱两可,并确保方法被准确调用所需的参数数量。

  • 谨慎使用以防止歧义: 在使用包含多个重载或相同类型参数的方法中的params时,谨慎是关键。 编译器可能会难以确定调用哪种方法,可能导致歧义错误。

  • 探索替代方法: 虽然params提供了便利,但在某些场景中应考虑替代方法。 使用集合如List<T>可能因其增强功能而更受欢迎,或者当传递命名参数与您的目标一致时。

  • 在相关场景中慎重应用: 在参数数量可变且不同方法调用之间可能会波动的场景中,谨慎地部署params。 当参数数量是固定且已知时,避免使用它。

参数类型的一维数组

AddItemsToShoppingBasket也可以通过调用其一维数组来使用。

class Program
{
    public static void Main()
    {
        var items = new string[] { "cold drink", "snack", "roll" }; // 1D string array
        AddItemsToShoppingBasket(items); // Works as expected
        AddItemsToShoppingBasket("cold drink", "coke", "roll"); // Similar result to the above line
    }
}
class Program
{
    public static void Main()
    {
        var items = new string[] { "cold drink", "snack", "roll" }; // 1D string array
        AddItemsToShoppingBasket(items); // Works as expected
        AddItemsToShoppingBasket("cold drink", "coke", "roll"); // Similar result to the above line
    }
}
Friend Class Program
	Public Shared Sub Main()
		Dim items = New String() { "cold drink", "snack", "roll" } ' 1D string array
		AddItemsToShoppingBasket(items) ' Works as expected
		AddItemsToShoppingBasket("cold drink", "coke", "roll") ' Similar result to the above line
	End Sub
End Class
$vbLabelText   $csharpLabel

传递同一类型的逗号分隔数组

AddItemsToShoppingBasket可以通过在方法调用中传递变量的列表/数组来调用,如下所示。

class Program
{
    public static void Main()
    {
        // Example method signature
        AddItemsToShoppingBasket("snacks", "burger", "snacks", "burger", "cold drink"); // Comma separated values
        AddItemsToShoppingBasket("snacks");
    }
}
class Program
{
    public static void Main()
    {
        // Example method signature
        AddItemsToShoppingBasket("snacks", "burger", "snacks", "burger", "cold drink"); // Comma separated values
        AddItemsToShoppingBasket("snacks");
    }
}
Friend Class Program
	Public Shared Sub Main()
		' Example method signature
		AddItemsToShoppingBasket("snacks", "burger", "snacks", "burger", "cold drink") ' Comma separated values
		AddItemsToShoppingBasket("snacks")
	End Sub
End Class
$vbLabelText   $csharpLabel

传递定义类型的数组

数组应包含在params方法中定义的相同类型; 否则会发生错误。

// Example that results in an error
AddItemsToShoppingBasket("snacks", 2, "burger"); // Error due to type mismatch
AddItemsToShoppingBasket(2, 3, 4); // Error since params type is string
// Example that results in an error
AddItemsToShoppingBasket("snacks", 2, "burger"); // Error due to type mismatch
AddItemsToShoppingBasket(2, 3, 4); // Error since params type is string
' Example that results in an error
AddItemsToShoppingBasket("snacks", 2, "burger") ' Error due to type mismatch
AddItemsToShoppingBasket(2, 3, 4) ' Error since params type is string
$vbLabelText   $csharpLabel

如果方法中params定义的类型不匹配,会出现语法错误。

始终是方法中的最后一个参数

在方法签名中不允许在params参数之后添加附加参数。 方法参数声明中只允许一个params参数。 错误地定义它会导致编译错误。

class Program
{
    static void Main(string[] args)
    {
        // Example 1
        public static void AddItemsToShoppingBasket(double total, params string[] items)
        {
            // Works fine as `params` is the last parameter
        }

        // Example 2, error scenario
        public static void AddItemsToShoppingBasket(params string[] items, decimal total, int total)
        {
            // Error: `params` keyword must be the last parameter 
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        // Example 1
        public static void AddItemsToShoppingBasket(double total, params string[] items)
        {
            // Works fine as `params` is the last parameter
        }

        // Example 2, error scenario
        public static void AddItemsToShoppingBasket(params string[] items, decimal total, int total)
        {
            // Error: `params` keyword must be the last parameter 
        }
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Example 1
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'		public static void AddItemsToShoppingBasket(double total, params string[] items)
'		{
'			' Works fine as `params` is the last parameter
'		}

		' Example 2, error scenario
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'		public static void AddItemsToShoppingBasket(params string[] items, decimal total, int total)
'		{
'			' Error: `params` keyword must be the last parameter 
'		}
	End Sub
End Class
$vbLabelText   $csharpLabel

只允许一个params关键字

方法签名中只允许一个params参数。 如果方法签名中找到多个params关键字,编译器会报错。

class Program
{
    static void Main(string[] args)
    {
        public static void AddItemsToShoppingBasket(params string[] items, params string[] quantity)
        {
            // Compiler Error: Only one params keyword is allowed in the method signature
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        public static void AddItemsToShoppingBasket(params string[] items, params string[] quantity)
        {
            // Compiler Error: Only one params keyword is allowed in the method signature
        }
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'		public static void AddItemsToShoppingBasket(params string[] items, params string[] quantity)
'		{
'			' Compiler Error: Only one params keyword is allowed in the method signature
'		}
	End Sub
End Class
$vbLabelText   $csharpLabel

您可以不传递参数

如果方法有一个带有params关键字的参数,它可以在没有任何参数的情况下被调用,并且编译器不会报错。

AddItemsToShoppingBasket(); // Works as expected
AddItemsToShoppingBasket(); // Works as expected
AddItemsToShoppingBasket() ' Works as expected
$vbLabelText   $csharpLabel

对于任何带有params参数的参数,它被视为一个可选参数,可以在不传递参数的情况下调用。

代码示例

创建一个新的控制台应用程序。 打开Visual Studio,创建一个新项目,并选择控制台应用程序类型。

!C# Params(它对开发者的工作机制):图1 - 创建新控制台应用程序

现在添加以下代码。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> cart = new List<string>();

        void AddItemsToShoppingBasket(params string[] samples)
        {
            for (int i = 0; i < samples.Length; i++)
            {
                cart.Add(samples[i]);
            }
        }

        // Caller code
        Console.WriteLine("Enter the cart items as comma separated values");
        var itemsString = Console.ReadLine();
        if (itemsString != null)
        {
            var items = itemsString.Split(",").ToArray();
            AddItemsToShoppingBasket(items);
        }
        AddItemsToShoppingBasket("Sample1", "Sample2");

        Console.WriteLine("-------------------------------------------------------");
        Console.WriteLine("Display Cart");

        foreach (var item in cart)
        {
            Console.WriteLine(item);
        }
    }
}
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> cart = new List<string>();

        void AddItemsToShoppingBasket(params string[] samples)
        {
            for (int i = 0; i < samples.Length; i++)
            {
                cart.Add(samples[i]);
            }
        }

        // Caller code
        Console.WriteLine("Enter the cart items as comma separated values");
        var itemsString = Console.ReadLine();
        if (itemsString != null)
        {
            var items = itemsString.Split(",").ToArray();
            AddItemsToShoppingBasket(items);
        }
        AddItemsToShoppingBasket("Sample1", "Sample2");

        Console.WriteLine("-------------------------------------------------------");
        Console.WriteLine("Display Cart");

        foreach (var item in cart)
        {
            Console.WriteLine(item);
        }
    }
}
Imports System
Imports System.Collections.Generic

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim cart As New List(Of String)()

'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'		void AddItemsToShoppingBasket(params string[] samples)
'		{
'			for (int i = 0; i < samples.Length; i++)
'			{
'				cart.Add(samples[i]);
'			}
'		}

		' Caller code
		Console.WriteLine("Enter the cart items as comma separated values")
		Dim itemsString = Console.ReadLine()
		If itemsString IsNot Nothing Then
			Dim items = itemsString.Split(",").ToArray()
			AddItemsToShoppingBasket(items)
		End If
		AddItemsToShoppingBasket("Sample1", "Sample2")

		Console.WriteLine("-------------------------------------------------------")
		Console.WriteLine("Display Cart")

		For Each item In cart
			Console.WriteLine(item)
		Next item
	End Sub
End Class
$vbLabelText   $csharpLabel

输出

!C# Params(它对开发者的工作机制):图2 - 上述代码输出

介绍IronPDF

Iron Software的IronPDF C# PDF库是一款多功能库,可以在C#中读取、写入和管理PDF文档。 它支持所有类型的现代应用程序开发,如移动端、网站、桌面端、Docker等。且支持不同操作系统如Windows、Linux、Unix等。它不依赖于本机操作系统方法。

IronPDF在HTML到PDF转换方面表现出色,确保精确保留原始布局和样式。 它非常适合从基于Web的内容中创建PDF,如报告、发票和文档。 利用对HTML文件、URL和原始HTML字符串的支持,IronPDF轻松生成高质量的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

安装

IronPDF库可以使用NuGet包管理器控制台通过以下命令或使用Visual Studio包管理器进行安装。

Install-Package IronPdf

使用IronPDF生成PDF

现在我们将使用IronPDF从上述示例中生成PDF文档。

using System;
using System.Collections.Generic;
using System.Linq;
using IronPdf;

class Program
{
    public static void Main()
    {
        List<string> cart = new List<string>();

        void AddItemsToShoppingBasket(params string[] items)
        {
            for (int i = 0; i < items.Length; i++)
            {
                cart.Add(items[i]);
            }
        }

        // Take input from console
        Console.WriteLine("Enter the cart items as comma separated values");
        var itemsString = Console.ReadLine();

        // Read the items
        if (itemsString != null)
        {
            var items = itemsString.Split(",").ToArray();
            AddItemsToShoppingBasket(items);
        }

        // Add to cart
        AddItemsToShoppingBasket("Sample1", "Sample2");

        Console.WriteLine("------------------------------------------------");
        Console.WriteLine("Display Cart");
        Console.WriteLine("------------------------------------------------");

        string name = "Sam";
        var count = cart.Count;
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} items in the cart.</p>
" +
        string.Join("\n", cart.Select(x => $"<p>{x}</p>"))
        + @"
</body>
</html>";

        // Create a new PDF document
        var pdfDoc = new ChromePdfRenderer();
        pdfDoc.RenderHtmlAsPdf(content).SaveAs("cart.pdf");
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using IronPdf;

class Program
{
    public static void Main()
    {
        List<string> cart = new List<string>();

        void AddItemsToShoppingBasket(params string[] items)
        {
            for (int i = 0; i < items.Length; i++)
            {
                cart.Add(items[i]);
            }
        }

        // Take input from console
        Console.WriteLine("Enter the cart items as comma separated values");
        var itemsString = Console.ReadLine();

        // Read the items
        if (itemsString != null)
        {
            var items = itemsString.Split(",").ToArray();
            AddItemsToShoppingBasket(items);
        }

        // Add to cart
        AddItemsToShoppingBasket("Sample1", "Sample2");

        Console.WriteLine("------------------------------------------------");
        Console.WriteLine("Display Cart");
        Console.WriteLine("------------------------------------------------");

        string name = "Sam";
        var count = cart.Count;
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} items in the cart.</p>
" +
        string.Join("\n", cart.Select(x => $"<p>{x}</p>"))
        + @"
</body>
</html>";

        // Create a new PDF document
        var pdfDoc = new ChromePdfRenderer();
        pdfDoc.RenderHtmlAsPdf(content).SaveAs("cart.pdf");
    }
}
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports IronPdf

Friend Class Program
	Public Shared Sub Main()
		Dim cart As New List(Of String)()

'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'		void AddItemsToShoppingBasket(params string[] items)
'		{
'			for (int i = 0; i < items.Length; i++)
'			{
'				cart.Add(items[i]);
'			}
'		}

		' Take input from console
		Console.WriteLine("Enter the cart items as comma separated values")
		Dim itemsString = Console.ReadLine()

		' Read the items
		If itemsString IsNot Nothing Then
			Dim items = itemsString.Split(",").ToArray()
			AddItemsToShoppingBasket(items)
		End If

		' Add to cart
		AddItemsToShoppingBasket("Sample1", "Sample2")

		Console.WriteLine("------------------------------------------------")
		Console.WriteLine("Display Cart")
		Console.WriteLine("------------------------------------------------")

		Dim name As String = "Sam"
		Dim count = cart.Count
		Dim content As String = $"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} items in the cart.</p>
" & String.Join(vbLf, cart.Select(Function(x) $"<p>{x}</p>")) & "
</body>
</html>"

		' Create a new PDF document
		Dim pdfDoc = New ChromePdfRenderer()
		pdfDoc.RenderHtmlAsPdf(content).SaveAs("cart.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

在上面的代码中,我们正在生成购物车项目的HTML文档,然后使用IronPDF将其保存为PDF文档。

输出

!C# Params(它对开发者的工作机制):图3 - 代码以上PDF输出

许可(提供免费试用)

IronPDF在生产环境中需要许可证密钥。 可以从许可证页面这里获得试用密钥。 将密钥放置在appsettings.json中。

"IronPdf.LicenseKey": "your license key"

提供您的电子邮件ID以获取试用许可证,将其发送到您的电子邮件ID。

结论

C#中的params关键字提供了一种灵活的方法来处理需要可变数量参数的方法。 它简化了方法调用,使代码更具可读性和可维护性。 与IronPDF一起,它是任何程序员编写干净代码的绝佳技能组合。

常见问题解答

C#中的'params'关键字是什么?

C#中的'params'关键字允许方法接受可变数量的参数,简化了调用拥有不同参数数量的方法的语法。

在方法签名中,'params'关键字如何运作?

在方法签名中,'params'关键字用于参数类型和参数名称之前,允许方法以数组的形式接受任意数量的该类型参数。

带有'params'的一个方法可以接受零个参数吗?

是的,带有'params'参数的方法可以在没有任何参数的情况下被调用,因为'params'参数被视为可选。

在C#中使用'params'的最佳实践是什么?

最佳实践包括将'params'参数放在参数列表的末尾,明确指定非'params'参数,且谨慎使用,仅在参数数量可变时使用。

一个C#方法可以有多个'params'参数吗?

不,C#方法只能有一个'params'参数,并且它必须是方法签名中的最后一个参数。

使用'params'如何提高C#方法的灵活性?

在C#方法中使用'params'允许开发者编写更具灵活性的代码,可以处理动态数量的参数,使维护和扩展变得更容易。

如何将'params'关键字与C#库结合用于文档生成?

可以将'params'关键字与C#库结合使用,以传递可变数量的参数以进行文档生成任务,例如使用IronPDF创建内容不同的PDF。

如何使用C#库将HTML转换为PDF?

您可以使用像IronPDF这样的C#库通过使用RenderHtmlAsPdf方法来将HTML字符串或RenderHtmlFileAsPdf来将HTML文件转换为PDF。

C#中'params'关键字的一些常见用例是什么?

常见用例包括需要处理可变数量输入的方法,如日志信息记录、数学运算或字符串输出构建。

如何在项目中集成用于PDF操作的C#库?

要集成用于PDF操作的C#库,如IronPDF,可以使用命令dotnet add package [LibraryName]通过NuGet安装,并使用其API执行PDF任务。

Curtis Chau
技术作家

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

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