.NET 帮助

C# 密封类(开发人员使用指南)

发布 2024年二月18日
分享:

在面向对象编程的世界里,C# 语言为开发人员提供了一套多功能工具,用于设计和实施强大的软件。其中一个为类继承添加额外控制层的功能就是密封类的概念。密封类提供了一种限制继承层次结构的独特方式,提供了一定程度的安全性和封装性,这在某些情况下是有益的。在本文中,我们将深入探讨 C# 密封类的复杂性,还将探索 IronPDF 的 NuGet 软件包 铁软件.

什么是密封类和密封方法?

密封类: 在 C# 中,密封类是一个不能被继承的类。通过使用 sealed 关键字,开发人员可以阻止其他类从该密封类派生或扩展。这种刻意的限制确保了密封类不能用作任何其他类的基类,从而限制了继承层次结构的范围。当开发人员想要控制和最终确定类的结构,防止通过继承进行意外修改时,通常会使用密封类。

请看下面的例子:

public sealed class Animal
{
    public string Species { get; set; }
    public void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal // Error: Cannot be inherited 
{
}
public sealed class Animal
{
    public string Species { get; set; }
    public void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal // Error: Cannot be inherited 
{
}
Public NotInheritable Class Animal
	Public Property Species() As String
	Public Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class
Public Class Dog ' Error: Cannot be inherited
	Inherits Animal

End Class
VB   C#

与隐式密封的结构不同,密封类必须使用密封关键字进行声明,如上图所示。在本例中,动物类被声明为密封类,因此任何其他类都无法从该类继承。

密封方法: 除了密封整个类,C# 还允许开发人员密封类中的单个方法。密封方法是一种任何派生类都无法覆盖的方法。这可确保该方法的行为在所有子类中保持一致,从而为应用程序的逻辑提供一定程度的可预测性。

要密封一个方法,请使用 sealed 修饰符:

public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
Public Class Animal
	Public Property Species() As String
	Public Overridable Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class
Public Class Dog
	Inherits Animal

	Public NotOverridable Overrides Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class
VB   C#

virtual 关键字允许在派生类中重写方法,而 sealed 关键字则防止在任何后续子类中进一步重写基类虚拟方法。

密封类和类成员:密封类还可以包括密封成员,如属性、方法和事件。这种密封类和密封成员的组合确保了对类的行为和结构的高度控制。

请看下面的例子:

public sealed class ControlledClass
{
    public sealed string ControlledProperty { get; set; }
    public virtual sealed void ControlledMethod()
    {
        // Method implementation
    }
    // Sealed event
    public sealed event EventHandler ControlledEvent;
    // Sealed indexers, if applicable
    public sealed string this [int index]
    {
        get { return "Value"; }
        set { /* Setter implementation */ }
    }
}
public sealed class ControlledClass
{
    public sealed string ControlledProperty { get; set; }
    public virtual sealed void ControlledMethod()
    {
        // Method implementation
    }
    // Sealed event
    public sealed event EventHandler ControlledEvent;
    // Sealed indexers, if applicable
    public sealed string this [int index]
    {
        get { return "Value"; }
        set { /* Setter implementation */ }
    }
}
Public NotInheritable Class ControlledClass
	Public NotOverridable Property ControlledProperty() As String
	Public Overridable NotOverridable Sub ControlledMethod()
		' Method implementation
	End Sub
	' Sealed event
	Public Event ControlledEvent As EventHandler
	' Sealed indexers, if applicable
	Default Public NotOverridable Property Item(ByVal index As Integer) As String
		Get
			Return "Value"
		End Get
		Set(ByVal value As String)
		End Set
	End Property
End Class
VB   C#

在此示例中,"ControlledClass "的每个方面都被密封,包括属性、方法、事件,甚至索引器(如果适用)。这种级别的密封提供了一种稳健且不可更改的结构,非常适合类的设计应保持固定的情况。

密封班背后的理由

代码安全性: 密封类可防止未经授权的访问和修改,从而提高代码安全性。当一个类被密封后,它就成为一个封闭的实体,具有定义明确的接口和行为。这种封装最大程度地降低了意外副作用或更改的风险,这些副作用或更改可能会损害代码库的稳定性和安全性。

设计完整性: 在大型代码库或框架中,保持设计完整性至关重要。密封类是具有固定结构的基础构件,可减少意外修改的机会。当一个类作为系统的核心组件,其行为应在不同模块间保持一致时,这一点尤其有益。

使用密封班级的最佳做法

  1. 谨慎使用密封类:虽然密封类有很多好处,但应谨慎使用。过度使用密封类会导致代码僵化,可维护性降低。

  2. 记录意图:在封存类或方法时,记录这一决定背后的意图至关重要。解释为什么要对某个类进行密封,以及做出这一选择的设计考虑因素。

  3. 考虑未来的可扩展性:在封存类之前,请考虑未来的需求是否需要扩展性。如果一个类有可能需要扩展,那么封印它可能会阻碍未来的发展。

  4. 使用密封方法以保持稳定:当一个方法的核心行为需要在不同子类中保持稳定时,封印方法可能是有益的。这可以提高代码的可预测性。

  5. 不能同时是抽象类: 密封类/密封方法不能同时是抽象类/抽象方法,因为抽象类的设计是为了被其他类继承,而密封类限制继承。

IronPDF 简介

C# 密封类(如何为开发人员工作):图 1 - IronPDF 网页

IronPDF 是一个来自 铁软件 是一款现代 PDF 生成器和阅读器。

安装

可以使用 NuGet 软件包管理器控制台或使用 Visual Studio 软件包管理器。下面是控制台的命令:

dotnet add package IronPdf

或者,要使用 NuGet 软件包管理器安装 IronPDF,请在 NuGet 软件包管理器的搜索栏中搜索 "ironpdf"。

C# 密封类(开发人员如何使用):图 2 - 通过 NuGet 软件包管理器安装 IronPDF 库

IronPDF 和密封类

sealed 关键字和 IronPDF 可共同用于防止子类库或派生库覆盖继承成员,并生成 PDF。

namespace OrderBy;
public class Program
{
    static void Main()
    {
        Console.WriteLine("Demo Sealed Class and IronPdf");
        var dog = new Dog();
        dog.MakeSound();
        dog.Print();
    }
}
// Sealed base class
public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public virtual void Print()
    {
        Console.WriteLine("Generic animal Print");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public sealed override void Print()
    {
        var pdfDocument = new ChromePdfRenderer();
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, Dog!</h1>
<p>This is Print from Derived class.</p>
<p>Print Animal Dog</p>
<p>Print Animal Sound: Bark</p>
</body>
</html>";
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("dog.pdf");
    }
}
namespace OrderBy;
public class Program
{
    static void Main()
    {
        Console.WriteLine("Demo Sealed Class and IronPdf");
        var dog = new Dog();
        dog.MakeSound();
        dog.Print();
    }
}
// Sealed base class
public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public virtual void Print()
    {
        Console.WriteLine("Generic animal Print");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public sealed override void Print()
    {
        var pdfDocument = new ChromePdfRenderer();
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, Dog!</h1>
<p>This is Print from Derived class.</p>
<p>Print Animal Dog</p>
<p>Print Animal Sound: Bark</p>
</body>
</html>";
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("dog.pdf");
    }
}
Namespace OrderBy
	Public Class Program
		Shared Sub Main()
			Console.WriteLine("Demo Sealed Class and IronPdf")
			Dim dog As New Dog()
			dog.MakeSound()
			dog.Print()
		End Sub
	End Class
	' Sealed base class
	Public Class Animal
		Public Property Species() As String
		Public Overridable Sub MakeSound()
			Console.WriteLine("Generic animal sound")
		End Sub
		Public Overridable Sub Print()
			Console.WriteLine("Generic animal Print")
		End Sub
	End Class
	Public Class Dog
		Inherits Animal

		Public NotOverridable Overrides Sub MakeSound()
			Console.WriteLine("Generic animal sound")
		End Sub
		Public NotOverridable Overrides Sub Print()
			Dim pdfDocument = New ChromePdfRenderer()
			Dim content As String = $"<!DOCTYPE html>
<html>
<body>
<h1>Hello, Dog!</h1>
<p>This is Print from Derived class.</p>
<p>Print Animal Dog</p>
<p>Print Animal Sound: Bark</p>
</body>
</html>"
	ignore ignore ignore ignore ignore ignore ignore ignore pdfDocument.RenderHtmlAsPdf(content).SaveAs("dog.pdf")
		End Sub
	End Class
End Namespace
VB   C#

C# 密封类(如何为开发人员工作):图 3 - 控制台输出,显示执行命令和由此产生的控制台信息

以下是 IronPDF 生成的 PDF 文件

C# 密封类(如何为开发人员工作):图 4 - 用前面的代码示例生成的 PDF 输出结果

许可 (可免费试用)

IronPDF.此密钥需要放在 appsettings.json 中。

"IronPdf.LicenseKey": "your license key"
"IronPdf.LicenseKey": "your license key"
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'"IronPdf.LicenseKey": "your license key"
VB   C#

提供您的电子邮件以获取试用许可证。

结论

C# 密封类为开发人员提供了一种强大的机制来控制继承层次结构,并确保某些类及其成员不能被扩展或覆盖。虽然使用密封类需要慎重考虑,但它们提供了一种封装功能和防止意外修改的有效方法。通过了解密封类和方法的概念,开发人员可以就何时何地应用这种限制做出明智的决定,从而有助于创建可维护、安全和可预测的软件系统。使用 IronPDF,我们还可以打印 PDF 文档。

< 前一页
C# 优先队列(它是如何为开发人员工作的)
下一步 >
C# LINQ 连接查询语法(开发人员如何使用)

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,731,156 查看许可证 >