跳過到頁腳內容
.NET幫助

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

匿名物件介紹

C#中的匿名類型提供了一種機制,可以將公共唯讀屬性封裝成一個單一的匿名類型物件,而不需要明確定義正式的類別聲明。 它們用於建立一次性使用的數據結構非常有用。 這些是由編譯器生成的類型,直接繼承自System.Object,有效地封裝物件屬性,並作為輕量且不可變的數據容器。 這些類型是封閉的類別,由編譯器自動推斷並生成類型名稱,這在源代碼層面上是不可訪問的。 我們還將發現IronPDF作為.NET項目的PDF庫。

關鍵特徵

  • 匿名類型具有嚴格限制的功能:
  • 在匿名類型的屬性定義中,屬性會自動實作為公共唯讀。
  • 使用者無法在其中明確定義方法、事件或其他類成員,如Equals或GetHashCode方法。
  • 不能以空值、匿名函數或指針類型初始化,這可確保匿名類型的完整性。

常见用例

LINQ操作

匿名數據類型物件在LINQ查詢表達式中尤其是在select子句中表現出色,其中它們能夠有效返回從較大對象中提取出的特定屬性子集。 此方法通過創建僅包含必要數據的臨時對象來優化內存使用。

臨時數據分組

它們作為臨時數據結構的高效率容器,當創建正式類別過於繁複時,這尤其適合於短期數據轉換或中間計算。

屬性封裝

匿名數據類型提供了一種將相關對象屬性使用唯讀屬性捆綁在一起的清晰方式。 編譯器確保類型安全同時保持屬性訪問的簡潔語法。

語法與結構

匿名類型的創建遵循使用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#匿名物件(對開發人員的工作原理):圖1-上述代碼範例的控制台輸出

結論

C#匿名物件(對開發人員的工作原理):圖2-IronPDF許可頁面

C#中的匿名類型提供了一種靈活且高效的方式來創建臨時數據結構,而不需要正式的類別聲明。 它們在處理LINQ查詢、數據轉換和像IronPDF這類庫時特別有用。 結合匿名類型與IronPDF的PDF生成能力提供了一個強大的解決方案,能夠以最少的代碼負擔創建動態、數據驅動的PDF。

IronPDF允許開發者通過免費試用測試其功能,這樣可以輕鬆探索其.NET應用中的功能。 商業許可證起價為$799,並允許使用其完整的功能集,包括高性能的HTML到PDF渲染、PDF編輯及安全功能。

常見問題解答

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

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

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

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

匿名類型如何在 C# 的 LINQ 操作中運行?

匿名類型在 LINQ 查詢表達式中非常出色,特別是在 select 子句中,通過有效返回較大物件中的特定屬性子集來優化記憶體使用。

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

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

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

匿名物件可以快速格式化資料以在動態 PDF 中渲染。通過與 PDF 庫(如 IronPDF)結合使用,可以以最少的代碼高效生成 PDF。

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

匿名類型僅限於具有公共唯讀屬性,不能具有方法、事件或顯式定義的類成員。它們也不能初始化為 null 值或指標類型。

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

匿名類型的常見用例包括臨時資料分組、屬性封裝和集合操作,其中創建一個正式類別會過於奢侈。

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

PDF 庫提供強大的工具,用於在 .NET 應用程序中生成、編輯和管理 PDF 文檔,從而促進高效的資料到 PDF 工作流程並增強資料驅動的解決方案。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。