C# Params(對於開發者的運行原理)
C# 中的 params 關鍵字是 .NET 中的一個強大功能,它允許方法接受可變數量的參數。 在呼叫需要不同數量參數的方法時,可以大幅簡化語法。 在本綜合指南中,我們將探討 C# 中的 params 關鍵字,包括其語法、用例和最佳實踐。 本文稍後將介紹Iron Software的IronPDF庫,並說明如何使用 params 關鍵字和 IronPDF 產生 PDF。
什麼是 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
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
注意事項與最佳實務
-將參數放在參數清單末端:建議將 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
傳送逗號分隔的同類型參數陣列
可以透過在方法呼叫中傳遞變數列表/陣列來呼叫 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
傳輸定義類型的陣列
陣列應包含在 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
如果方法中定義的 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
僅一 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
您不能通過任何論點
如果一個方法有一個帶有 params 關鍵字的參數,則可以不帶任何參數來呼叫該方法,編譯器不會拋出錯誤。
AddItemsToShoppingBasket(); // Works as expected
AddItemsToShoppingBasket(); // Works as expected
AddItemsToShoppingBasket() ' Works as expected
對於任何具有 params 參數的參數,它被視為可選參數,無需傳遞參數即可呼叫。
程式碼範例
建立新的控制台應用程式。 開啟 Visual Studio,建立新專案,並選擇主控台應用程式類型。

現在新增以下程式碼。
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
輸出

介紹 IronPDF。
Iron Software 的 IronPDF C# PDF 函式庫是一個多功能函式庫,能以 C# 語言讀取、寫入及管理 PDF 文件。 它支援各種現代應用程式開發,如 Mobile、Website、Desktop、Docker 等。同時也支援不同的作業系統,如 Windows、Linux、Unix 等。它不依賴於原生作業系統的方法。
IronPDF 擅長於 HTML 至 PDF 的轉換,可確保精確保留原始版面與樣式。 它非常適合從網頁內容(如報告、發票和文件)建立 PDF。 IronPDF 支援 HTML 檔案、URL 和原始 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
安裝
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
在上述程式碼中,我們為購物車項目生成 HTML 文件,然後再使用 IronPDF 將其儲存為 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# 庫將 HTML 轉換為 PDF,通過使用方法如 RenderHtmlAsPdf 對於 HTML 字串或 RenderHtmlFileAsPdf 對於 HTML 文件。
在 C# 中 'params' 關鍵字的一些常見使用案例是什麼?
常見的使用案例包括需要處理可變數量輸入的方法,例如記錄消息、數學運算或構建字串輸出。
如何在項目中集成 C# 庫以進行 PDF 操作?
要集成 C# 庫用於 PDF 操作,如 IronPDF,您可以使用命令 dotnet add package [LibraryName] 通過 NuGet 安裝,然後使用其 API 來執行 PDF 任務。



