跳過到頁腳內容
.NET幫助

C#匿名物件(開發者如何理解其工作)

匿名物件簡介

C# 中的匿名類型提供了一種機制,可在不明文定義正式類別宣告的情況下,將公開唯讀屬性封裝到單一匿名類型物件中。 這些工具對於建立單次使用的資料結構非常有用。 這些都是編譯器產生的類型,直接衍生自 System.Object,可有效地封裝物件屬性,並作為輕量、不可變的資料容器。 這些類型是密封的類別,編譯器會自動推斷並產生類型名稱,在原始碼層級仍無法存取。 我們還會發現 IronPDF 作為 .NET 專案的 PDF 函式庫。

主要特點

  • 匿名類型的能力受到嚴格限制:
  • 在匿名類型的屬性定義中,屬性會自動實作為公開唯讀。
  • 使用者無法在其中明確定義方法、事件或其他類成員,例如 Equals 或 GetHashCode 方法。
  • 不能使用空值、匿名函數或指標類型進行初始化,確保匿名類型的完整性。

常見使用案例

LINQ作業

匿名資料類型物件在 LINQ 查詢表達式中表現優異,特別是在匿名類型物件的選擇子句中,它們能有效率地從較大的物件中傳回特定的屬性子集。 此方法可透過建立僅包含必要資料的暫存物件來最佳化記憶體使用量。

臨時資料群組

當建立正式的類別過度時,這些工具可作為臨時資料結構的有效容器。這對於短暫的資料轉換或中間計算特別有用。

屬性封裝

匿名資料類型提供一種乾淨的方式,使用唯讀屬性將相關的物件屬性捆綁在一起。 編譯器可確保類型安全,同時維持簡明的屬性存取語法。

文法與結構

匿名類型的建立遵循特定的模式,使用 var 關鍵字以及 new 運算符和物件初始化器語法。 編譯器會自動產生一個在原始碼層級無法存取的類型名稱。

var person = new { FirstName = "Iron", LastName = "Dev", Age = 35 }; // public int age in this anonymous type
var person = new { FirstName = "Iron", LastName = "Dev", Age = 35 }; // public int age in this anonymous type
Private person = New With {
	Key .FirstName = "Iron",
	Key .LastName = "Dev",
	Key .Age = 35
}
$vbLabelText   $csharpLabel

屬性初始化規則

編譯器對匿名類型中的屬性初始化執行嚴格的規則。所有的屬性都必須在物件建立時初始化,而且不能指定為空值或指標類型。一旦初始化,就可以使用標準的點符號存取屬性值,但由於屬性值的唯讀性質,初始化之後就無法修改。

類型推斷與匹配

var person1 = new { Name = "Iron", Age = 30 };
var person2 = new { Name = "Dev", Age = 25 };
var person1 = new { Name = "Iron", Age = 30 };
var person2 = new { Name = "Dev", Age = 25 };
Dim person1 = New With {
	Key .Name = "Iron",
	Key .Age = 30
}
Dim person2 = New With {
	Key .Name = "Dev",
	Key .Age = 25
}
$vbLabelText   $csharpLabel

編譯器會針對具備匹配屬性名稱、類型和順序的匿名類型產生相同的類型資訊。 這允許在集合中使用的實體或在同一組合中作為方法參數傳遞的實體之間具有類型相容性。

嵌套的匿名類型

匿名資料類型支援具有匿名類型物件屬性的複雜嵌套結構。 這對建立分層資料表示法很有幫助:

var student = new {
    Id = 1,
    PersonalInfo = new {
        Name = "James",
        Contact = new {
            Email = "james@email.com",
            Phone = "123-456-7890"
        }
    },
    Grades = new { Math = 95, Science = 88 }
};
var student = new {
    Id = 1,
    PersonalInfo = new {
        Name = "James",
        Contact = new {
            Email = "james@email.com",
            Phone = "123-456-7890"
        }
    },
    Grades = new { Math = 95, Science = 88 }
};
Dim student = New With {
	Key .Id = 1,
	Key .PersonalInfo = New With {
		Key .Name = "James",
		Key .Contact = New With {
			Key .Email = "james@email.com",
			Key .Phone = "123-456-7890"
		}
	},
	Key .Grades = New With {
		Key .Math = 95,
		Key .Science = 88
	}
}
$vbLabelText   $csharpLabel

集合作業

匿名類型擅長於涉及收集操作和資料轉換的場景:

var items = new[] {
    new { ProductId = 1, Name = "Laptop", Price = 1200.00m },
    new { ProductId = 2, Name = "Mouse", Price = 25.99m },
    new { ProductId = 3, Name = "Keyboard", Price = 45.50m }
};
var items = new[] {
    new { ProductId = 1, Name = "Laptop", Price = 1200.00m },
    new { ProductId = 2, Name = "Mouse", Price = 25.99m },
    new { ProductId = 3, Name = "Keyboard", Price = 45.50m }
};
Dim items = {
	New With {
		Key .ProductId = 1,
		Key .Name = "Laptop",
		Key .Price = 1200.00D
	},
	New With {
		Key .ProductId = 2,
		Key .Name = "Mouse",
		Key .Price = 25.99D
	},
	New With {
		Key .ProductId = 3,
		Key .Name = "Keyboard",
		Key .Price = 45.50D
	}
}
$vbLabelText   $csharpLabel

IronPDF:C# PDF 函式庫

IronPDF 是一個功能強大的函式庫,用於在 .NET 應用程式中產生、編輯和管理 PDF 文件。 在使用 C# 工作時,開發人員通常會使用 匿名物件 來建立輕量級和特別的資料結構,尤其是在不需要建立整個類別的情況下。 這些匿名物件可與 IronPDF 無縫利用,以 動態建立 PDF 文件。 它有助於為快速資料轉換為 PDF 的工作流程建立靈活的解決方案。 以下是一個範例,說明 IronPDF 如何使用匿名物件:

範例:使用匿名物件填充 PDF

假設您有一張銷售資料清單,您希望在 PDF 中以表格的形式呈現。 您可以使用匿名物件來快速格式化資料以進行呈現,而不需要建立正式的類別。

using IronPdf;
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        // Set your IronPDF license key here
        License.LicenseKey = "Your-Licence-Key";

        // Sample data using anonymous objects
        var salesData = new[]
        {
            new { Product = "Laptop", Quantity = 2, Price = 1200.50 },
            new { Product = "Smartphone", Quantity = 5, Price = 800.00 },
            new { Product = "Headphones", Quantity = 10, Price = 150.75 }
        };

        // Create an HTML string dynamically using the anonymous object data
        var htmlContent = @"
        <html>
        <head><style>table {border-collapse: collapse;} th, td {border: 1px solid black; padding: 5px;}</style></head>
        <body>
        <h1>Sales Report</h1>
        <table>
            <thead>
                <tr>
                    <th>Product</th>
                    <th>Quantity</th>
                    <th>Price</th>
                </tr>
            </thead>
            <tbody>
                " +
            string.Join("", salesData.Select(item =>
                $"<tr><td>{item.Product}</td><td>{item.Quantity}</td><td>{item.Price:C}</td></tr>")) +
            @"
            </tbody>
        </table>
        </body>
        </html>";

        // Generate the PDF
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);

        // Save the PDF
        pdf.SaveAs("SalesReport.pdf");
        Console.WriteLine("PDF generated successfully!");
    }
}
using IronPdf;
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        // Set your IronPDF license key here
        License.LicenseKey = "Your-Licence-Key";

        // Sample data using anonymous objects
        var salesData = new[]
        {
            new { Product = "Laptop", Quantity = 2, Price = 1200.50 },
            new { Product = "Smartphone", Quantity = 5, Price = 800.00 },
            new { Product = "Headphones", Quantity = 10, Price = 150.75 }
        };

        // Create an HTML string dynamically using the anonymous object data
        var htmlContent = @"
        <html>
        <head><style>table {border-collapse: collapse;} th, td {border: 1px solid black; padding: 5px;}</style></head>
        <body>
        <h1>Sales Report</h1>
        <table>
            <thead>
                <tr>
                    <th>Product</th>
                    <th>Quantity</th>
                    <th>Price</th>
                </tr>
            </thead>
            <tbody>
                " +
            string.Join("", salesData.Select(item =>
                $"<tr><td>{item.Product}</td><td>{item.Quantity}</td><td>{item.Price:C}</td></tr>")) +
            @"
            </tbody>
        </table>
        </body>
        </html>";

        // Generate the PDF
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);

        // Save the PDF
        pdf.SaveAs("SalesReport.pdf");
        Console.WriteLine("PDF generated successfully!");
    }
}
Imports IronPdf
Imports System
Imports System.Linq

Friend Class Program
	Shared Sub Main()
		' Set your IronPDF license key here
		License.LicenseKey = "Your-Licence-Key"

		' Sample data using anonymous objects
		Dim salesData = {
			New With {
				Key .Product = "Laptop",
				Key .Quantity = 2,
				Key .Price = 1200.50
			},
			New With {
				Key .Product = "Smartphone",
				Key .Quantity = 5,
				Key .Price = 800.00
			},
			New With {
				Key .Product = "Headphones",
				Key .Quantity = 10,
				Key .Price = 150.75
			}
		}

		' Create an HTML string dynamically using the anonymous object data
		Dim htmlContent = "
        <html>
        <head><style>table {border-collapse: collapse;} th, td {border: 1px solid black; padding: 5px;}</style></head>
        <body>
        <h1>Sales Report</h1>
        <table>
            <thead>
                <tr>
                    <th>Product</th>
                    <th>Quantity</th>
                    <th>Price</th>
                </tr>
            </thead>
            <tbody>
                " & String.Join("", salesData.Select(Function(item) $"<tr><td>{item.Product}</td><td>{item.Quantity}</td><td>{item.Price:C}</td></tr>")) & "
            </tbody>
        </table>
        </body>
        </html>"

		' Generate the PDF
		Dim renderer = New ChromePdfRenderer()
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)

		' Save the PDF
		pdf.SaveAs("SalesReport.pdf")
		Console.WriteLine("PDF generated successfully!")
	End Sub
End Class
$vbLabelText   $csharpLabel

C# Anonymous Object (How it Works for Developers):圖 1 - 上述程式碼範例的控制台輸出

結論

C# Anonymous Object (How it Works for Developers):圖 2 - IronPDF 授權頁面

C# 中的匿名類型提供了一種靈活有效的方式來建立臨時資料結構,而不需要正式的類別宣告。 這些工具在使用 LINQ 查詢、資料轉換以及 IronPDF 等函式庫時特別有用。 將匿名類型與 IronPDF 的 PDF 生成功能相結合,可提供強大的解決方案,以最小的代碼開銷創建動態、資料驅動的 PDF。

IronPDF 允許開發人員透過 免費試用來測試其功能,讓您可以輕鬆地在 .NET 應用程式中探索其功能。 商業授權的起價為 $799 並允許存取其完整的功能集,包括高效能的 HTML 至 PDF 渲染、PDF 編輯和安全功能。

常見問題解答

什麼是 C# 中的匿名類型?

C# 中的匿名類型提供了一種機制,可將公共唯讀屬性封裝到單一匿名類型物件中,而無需明確定義一個正式的類別宣告。它們是編譯器產生的類型,用作輕量級、不可變的資料容器。

如何在 C# 中建立匿名類型?

要在 C# 中建立匿名類型,您可以使用 var 關鍵字,並搭配 new 運算符和物件初始化器語法。編譯器會根據提供的屬性自動產生類型名稱和結構。

匿名類型如何與 C# 中的 LINQ 作業搭配使用?

匿名類型在 LINQ 查詢表達式(特別是在選擇子句中)中表現優異,可從較大的物件中有效率地傳回特定的屬性子集,優化記憶體的使用。

匿名類型可以用在嵌套結構中嗎?

是的,匿名類型可以用在嵌套結構中。這允許建立分層資料表示法,其中匿名類型的屬性本身也可以是匿名類型物件。

如何使用匿名物件建立動態 PDF?

匿名物件可以快速格式化資料,以便在動態 PDF 中呈現。透過將它們與 PDF 函式庫 (例如 IronPDF) 結合,您可以用最少的程式碼有效率地產生 PDF。

C# 中匿名類型有哪些限制?

匿名類型僅限於具有公共唯讀屬性,且不能具有方法、事件或明確定義的類成員。它們也不能使用空值或指標類型來初始化。

匿名類型的常見用例有哪些?

匿名類型的常見用例包括臨時資料群組、屬性封裝和集合作業,在這些情況下,建立正式的類別是過度的。

PDF 函式庫如何增強 .NET 應用程式中的資料轉 PDF 工作流程?

PDF 函式庫提供強大的工具,可在 .NET 應用程式中產生、編輯和管理 PDF 文件,促進有效率的資料轉 PDF 工作流程,並強化資料驅動的解決方案。

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

Jacob Mellor 是 Iron Software 的首席技術官,作為 C# PDF 技術的先鋒工程師。作為 Iron Software 核心代碼的原作者,他自開始以來塑造了公司產品架構,與 CEO Cameron Rimington 一起將其轉變為一家擁有超過 50 名員工的公司,為 NASA、特斯拉 和 全世界政府機構服務。

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

他的旗艦產品 IronPDF & Iron Suite .NET 庫在全球 NuGet 被安裝超過 3000 萬次,其基礎代碼繼續為世界各地的開發工具提供動力。擁有 25 年的商業經驗和 41 年的編碼專業知識,Jacob 仍專注於推動企業級 C#、Java 及 Python PDF 技術的創新,同時指導新一代技術領袖。