在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
在 C# 程式設計的物件導向環境中,原始建構函式的引入為語言帶來了一層新的優雅與簡潔。 主構造函式與攔截器及集合表達式等功能一起在 C# 12 中出現,作為一項強大的特色,提供了一種更精簡的語法來聲明帶有參數的構造函式。 您可以在 Microsoft C# 導覽.
在本文中,我們將學習如何有效利用 C# 12 主要構造函數,還將探索其功能、使用情況,以及它們如何改變開發人員處理類初始化的方式。
建構函式在物件導向程式設計中發揮關鍵作用,它們作為初始化物件的藍圖。 傳統上,C# 開發者使用默認構造函數或參數化構造函數來設置類的初始狀態。 然而,引入主構造函數為 C# 開發的這一重要方面提供了一種更簡化的方法。
在 C# 中,主構造函式是一種簡潔的方式,可以在類別宣告中直接宣告和初始化屬性。 它簡化了屬性定義和賦值的過程,提供了更具聲明性和可讀性的語法。
簡潔性: 主構造函數提供了簡潔的語法,減少樣板代碼並提高可讀性。
作用域: 與傳統構造函數不同,主構造函數中的參數在整個類或結構中都在作用域內,提供了使用上的靈活性。
主構造函數的語法涉及在類標題中直接聲明屬性。 讓我們考慮一個基本的 Person 類別範例:
public class Person(string name, int age)
{
public string Name { get; } = name;
public int Age { get; } = age
public override string ToString() => $"Name: {Name}, Age: {Age}";
}
public class Person(string name, int age)
{
public string Name { get; } = name;
public int Age { get; } = age
public override string ToString() => $"Name: {Name}, Age: {Age}";
}
Public Class Person(String name, Integer age)
Public ReadOnly Property Name() As String = name
public Integer Age {get;} = age public override String ToString()
If True Then
Return $"Name: {Name}, Age: {Age}"
End If
End Class
在上述程式碼片段中,Person 類別具有一個主建構子,用於初始化實例成員 Name 和實例成員 Age 屬性。 構造函式的參數與類或結構的名稱一起宣告,並在定義公共屬性時將參數值賦予它們。
public readonly struct Point(double x, double y)
{
public double X { get; } = x;
public double Y { get; } = y;
public double Magnitude => Math.Sqrt(X * X + Y * Y);
}
public readonly struct Point(double x, double y)
{
public double X { get; } = x;
public double Y { get; } = y;
public double Magnitude => Math.Sqrt(X * X + Y * Y);
}
'INSTANT VB WARNING: VB has no equivalent to the C# readonly struct:
'ORIGINAL LINE: public readonly struct Point(double x, double y)
Public Structure Point(Double x, Double y)
Public ReadOnly Property X() As Double = x
Public ReadOnly Property Y() As Double = y
Public ReadOnly Property Magnitude() As Double
Get
Return Math.Sqrt(X * X + Y * Y)
End Get
End Property
End Structure
在這個例子中,Point 結構的主要構造函數初始化了 X 和 Y 屬性,展示了語法可以多麼簡潔和表達力。
public class Logger(string filePath = "log.txt", LogLevel level = LogLevel.Info)
{
private readonly string _filePath = filePath;
private readonly LogLevel _level = level;
public void Log(string message)
{
// Actual logging implementation using _filePath and _level
}
}
public class Logger(string filePath = "log.txt", LogLevel level = LogLevel.Info)
{
private readonly string _filePath = filePath;
private readonly LogLevel _level = level;
public void Log(string message)
{
// Actual logging implementation using _filePath and _level
}
}
'INSTANT VB TODO TASK: The following line contains an assignment within expression that was not extracted by Instant VB:
'ORIGINAL LINE: public class Logger(string filePath = "log.txt", LogLevel level = LogLevel.Info)
Public Class Logger(String filePath = "log.txt", LogLevel level = LogLevel.Info)
Private ReadOnly _filePath As String = filePath
Private ReadOnly _level As LogLevel = level
Public Sub Log(ByVal message As String)
' Actual logging implementation using _filePath and _level
End Sub
End Class
下面,Logger 類別的主要構造函數為 filePath 和 level 提供了預設值,使其靈活且易於使用,同時保持可配置性。
public interface IService
{
Distance GetDistance();
}
public class ExampleController(IService service) : ControllerBase
{
public ActionResult<Distance> Get() => service.GetDistance();
}
public interface IService
{
Distance GetDistance();
}
public class ExampleController(IService service) : ControllerBase
{
public ActionResult<Distance> Get() => service.GetDistance();
}
Public Interface IService
Function GetDistance() As Distance
End Interface
Public Class ExampleController(IService service)
Inherits ControllerBase
Public Function [Get]() As ActionResult(Of Distance)
Return service.GetDistance()
End Function
End Class
主構造函數適用於依賴注入情境。 在這個例子中,一個控制器類別指出其依賴性,增強了可維護性並促進了單元測試。
public abstract class Shape(double width, double height)
{
public double Width { get; } = width;
public double Height { get; } = height;
public abstract double CalculateArea();
}
public class Rectangle(double width, double height) : Shape(width, height)
{
public override double CalculateArea() => Width * Height;
}
public class Circle : Shape
{
public Circle(double radius) : base(radius * 2, radius * 2) { }
public override double CalculateArea() => Math.PI * Math.Pow(Width / 2, 2);
}
public abstract class Shape(double width, double height)
{
public double Width { get; } = width;
public double Height { get; } = height;
public abstract double CalculateArea();
}
public class Rectangle(double width, double height) : Shape(width, height)
{
public override double CalculateArea() => Width * Height;
}
public class Circle : Shape
{
public Circle(double radius) : base(radius * 2, radius * 2) { }
public override double CalculateArea() => Math.PI * Math.Pow(Width / 2, 2);
}
Public MustInherit Class Shape(Double width, Double height)
Public ReadOnly Property Width() As Double = width
Public ReadOnly Property Height() As Double = height
Public MustOverride Function CalculateArea() As Double
End Class
Public Class Rectangle(Double width, Double height)
Inherits Shape(width, height)
Public Overrides Function CalculateArea() As Double
Return Width * Height
End Function
End Class
Public Class Circle
Inherits Shape
Public Sub New(ByVal radius As Double)
MyBase.New(radius * 2, radius * 2)
End Sub
Public Overrides Function CalculateArea() As Double
Return Math.PI * Math.Pow(Width / 2, 2)
End Function
End Class
在此範例中,Shape 類別中的主要建構函式構成了幾何形狀階層的基礎。 像 Rectangle 和 Circle 這樣的子類利用主要構造函數進行一致性初始化。 Rectangle 類本身宣告了主要建構子,並將捕獲的主要建構子參數傳遞給 Shape 類的主要參數。 Circle 類別透過在整個類別中定義其建構函數,並使用 base 關鍵字將其參數作為 Shape 建構函數的預設值,展示了其靈活性。
IronPDF是一個多功能的C#庫,使開發人員能夠輕鬆創建、操作和轉換PDF文件。 無論您是生成發票、報告或任何其他文件,IronPDF 允許您在 C# 應用程式中將 HTML 內容無縫轉換為精美且專業的 PDF。
要將 IronPDF 整合到您的 C# 專案中,首先安裝 IronPDF NuGet 套件。 在您的套件管理器控制台中執行以下命令:
Install-Package IronPdf
或者,在 NuGet 套件管理器中找到 "IronPDF",然後從那裡進行安裝。
使用 IronPDF 創建 PDF 是一個精簡的過程。 請考慮以下示例:
var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
// Create a new PDF document
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
// Create a new PDF document
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
Dim htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>"
' Create a new PDF document
Dim pdfDocument = New IronPdf.ChromePdfRenderer()
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf")
在此範例中,IronPDF 被用於將 HTML 內容渲染成 PDF 文件,然後儲存到指定的位置。 有關使用 C# 創建和操作 PDF 的詳細資訊,請訪問此完整教學連結, 如需了解更多,請訪問此文檔頁面。
C# 主要建構函式提供了一種宣告式且精簡的方法,直接在類別宣告中初始化類別屬性。 讓我們探討這個優雅的功能是否能夠無縫整合到IronPDF中。
雖然 C# 主構造函式主要是一項針對類別初始化的語言功能,但它們與 IronPDF 的直接整合可能不是常見的使用情境。 IronPDF 的核心功能在於生成和操作 PDF 文件,類的初始化細節可能與此工作流程不直接對應。
然而,開發人員可以利用 C# 主構造函數在定義與 IronPDF 配置或數據模型相關的自訂類別或結構時使用。 例如,如果您的應用程式需要特定的類別結構來管理 PDF 相關的設置或配置,C# 主要建構函式可以成為一個寶貴的工具,用於簡潔地初始化這些類別。
public class PdfGenerationSettings(string title, bool includeHeader, bool includeFooter)
{
public string Title { get; } = title;
public bool IncludeHeader { get; } = includeHeader;
public bool IncludeFooter { get; } = includeFooter;
// Additional properties...
}
// Usage with IronPDF
var pdfSettings = new PdfGenerationSettings("My PDF Title", true, false);
var renderOptions = new ChromePdfRenderOptions();
// Apply settings from PdfGenerationSettings
renderOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderOptions.MarginTop = 20;
renderOptions.MarginBottom = 20;
renderOptions.MarginLeft = 10;
renderOptions.MarginRight = 10;
renderOptions.Title = pdfSettings.Title ?? string.Empty;
if (pdfSettings.IncludeHeader)
{
renderOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Page {page} of {total-pages}",
DrawDividerLine = true
};
}
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderingOptions = renderOptions;
pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>").SaveAs("CustomizedDocument.pdf");
public class PdfGenerationSettings(string title, bool includeHeader, bool includeFooter)
{
public string Title { get; } = title;
public bool IncludeHeader { get; } = includeHeader;
public bool IncludeFooter { get; } = includeFooter;
// Additional properties...
}
// Usage with IronPDF
var pdfSettings = new PdfGenerationSettings("My PDF Title", true, false);
var renderOptions = new ChromePdfRenderOptions();
// Apply settings from PdfGenerationSettings
renderOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderOptions.MarginTop = 20;
renderOptions.MarginBottom = 20;
renderOptions.MarginLeft = 10;
renderOptions.MarginRight = 10;
renderOptions.Title = pdfSettings.Title ?? string.Empty;
if (pdfSettings.IncludeHeader)
{
renderOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Page {page} of {total-pages}",
DrawDividerLine = true
};
}
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderingOptions = renderOptions;
pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>").SaveAs("CustomizedDocument.pdf");
Public Class PdfGenerationSettings(String title, Boolean includeHeader, Boolean includeFooter)
Public ReadOnly Property Title() As String = title
Public ReadOnly Property IncludeHeader() As Boolean = includeHeader
Public ReadOnly Property IncludeFooter() As Boolean = includeFooter
' Additional properties...
End Class
' Usage with IronPDF
Private pdfSettings = New PdfGenerationSettings("My PDF Title", True, False)
Private renderOptions = New ChromePdfRenderOptions()
' Apply settings from PdfGenerationSettings
renderOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
renderOptions.MarginTop = 20
renderOptions.MarginBottom = 20
renderOptions.MarginLeft = 10
renderOptions.MarginRight = 10
renderOptions.Title = If(pdfSettings.Title, String.Empty)
If pdfSettings.IncludeHeader Then
renderOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Page {page} of {total-pages}",
.DrawDividerLine = True
}
End If
Dim pdfDocument = New IronPdf.ChromePdfRenderer()
pdfDocument.RenderingOptions = renderOptions
pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>").SaveAs("CustomizedDocument.pdf")
在此範例中,PdfGenerationSettings 類別使用 C# 主構造函式來初始化與 PDF 生成設置相關的屬性。 之後可以用來確定要添加或略過哪些渲染選項。輸出包含了一個標題文本和使用主要構造函數參數設定的標題。
總結來說,C# 中的主構造函數提供了一種精緻且富表現力的類初始化方法。 他們的宣告式語法增強了程式碼的可讀性,促進了不變性,並簡化了創建具有預設值的物件的過程。 無論您是在定義屬性、強制不變性,還是接受預設值,主建構函式都能使開發人員在充滿動態的 C# 程式設計世界中掌握類別初始化的藝術。
雖然 C# 主構造函數與 IronPDF 的直接整合可能不是主要關注點,但這兩個元素可以和諧地一起工作。 C# 主構造函式增強了類初始化的清晰度和簡單性,使其對於定義與 IronPDF 工作流程相關的結構或配置具有價值。
利用IronPDF的強大功能進行穩健的PDF生成,並在類初始化優雅性至關重要時使用C#主構造函數。 這對強大的組合使您能夠在充滿活力的 C# 程式設計世界中,以創造性和效率應對文件生成的複雜性。