跳過到頁腳內容
.NET幫助

C# Params(對於開發者的運行原理)

C#中的params關鍵字是.NET中的一個強大功能,允許方法接受可變數量的參數。 當調用需要不同數量參數的方法時,這可以顯著簡化語法。 在這本綜合指南中,我們將探討C#中的params關鍵字、其語法、用例和最佳實踐。 稍後在本文中,我們將介紹IronPDF程式庫,來自Iron Software,並解釋如何使用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
    }
}
$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
    }
}
$vbLabelText   $csharpLabel

考慮事項和最佳實踐

  • 將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
    }
}
$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");
    }
}
$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
$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 
        }
    }
}
$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
        }
    }
}
$vbLabelText   $csharpLabel

您可以不傳遞參數

如果方法具有params關鍵字的參數,它可以在不傳遞參數的情況下被調用,而編譯器也不會拋出錯誤。

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

對於具有params參數的參數,它被視作可選參數,可以不傳遞參數就調用。

程式碼範例

創建一個新的控制台應用程式。 打開Visual Studio,創建一個新專案,並選擇控制台應用程式類型。

C# Params (How It Works For Developers): 圖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);
        }
    }
}
$vbLabelText   $csharpLabel

輸出

C# Params (How It Works For Developers): 圖2 - 上述代碼的輸出

介紹IronPDF

來自Iron Software的IronPDF C# PDF程式庫是一個多功能的程式庫,能夠在C#中讀取、編寫和管理PDF文件。 它支持各種現代應用程式開發,如行動裝置、網站、桌面、Docker等。還支持不同的操作系統,如Windows、Linux、Unix等。它不依賴於本地操作系統方法。

IronPDF在HTML轉PDF轉換中表現卓越,確保精確保留原始佈局和樣式。 它非常適合從基於網頁的內容(如報告、發票和文檔)創建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");
    }
}
$vbLabelText   $csharpLabel

安裝

可以使用NuGet套件管理器控制台,通過以下命令或使用Visual Studio套件管理器安裝IronPDF程式庫。

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");
    }
}
$vbLabelText   $csharpLabel

在上述代碼中,我們正在生成一個HTML文件的購物車項,然後使用IronPDF將其保存為PDF文件。

輸出

C# Params (How It Works For Developers): 圖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# 庫將 HTML 轉換為 PDF,通過使用方法如 RenderHtmlAsPdf 對於 HTML 字符串或 RenderHtmlFileAsPdf 對於 HTML 文件。

在 C# 中 'params' 關鍵字的一些常見使用案例是什麼?

常見的使用案例包括需要處理可變數量輸入的方法,例如記錄消息、數學運算或構建字符串輸出。

如何在項目中集成 C# 庫以進行 PDF 操作?

要集成 C# 庫用於 PDF 操作,如 IronPDF,您可以使用命令 dotnet add package [LibraryName] 通過 NuGet 安裝,然後使用其 API 來執行 PDF 任務。

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me