在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
在C#编程的面向对象领域中,引入主构造函数为语言带来了新的优雅和简洁层次。 主构造函数以及拦截器和集合表达式等特性在 C# 12 中作为强大的功能出现,提供了一种更简洁的语法来声明带有参数的构造函数。 您可以在以下网站深入了解主构造函数微软 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的更多详细信息,请访问此完整的*教程链接***、,如需了解更多信息,请访问此处文件page.
C# 主构造函数提供了一种声明性且简化的方法,可以在类声明中直接初始化类属性。 让我们探讨这种优雅的功能是否能够无缝集成到IronPDF中。
虽然C#主构造函数主要是一种专注于类初始化的语言特性,但它们与IronPDF的直接集成可能不是常见的用例。 IronPDF 的核心功能在于生成和操作 PDF 文档,类初始化的具体细节可能与此工作流程不直接对齐。
然而,开发人员在定义与IronPDF配置或数据模型相关的自定义类或结构时,可以利用C# 主构造函数。 例如,如果您的应用程序需要特定的类结构来管理与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#编程世界中,以创意和效率驾驭文档生成的复杂性。