跳至页脚内容
.NET 帮助

C# Internal(开发者如何使用)

在静态 void main 程序中管理表单类、方法和属性的可见性时,访问修饰符在 C# 的基于组件的开发编程语言中是必不可少的。 在构建模块化且可维护的图形用户界面时,一个相关的访问修饰符是 internal。 本文将讨论 C# internal 的概念,以及其在 IronPDF(一个用于管理 PDF 文档的灵活 C# 框架)中的多个应用。

如何在 C# 组件开发中使用内部成员

  1. 创建一个 C# 项目。
  2. 理解 internal 访问修饰符。
  3. 将 'internal' 应用于成员。
  4. 在程序集级别组织代码。
  5. 在同一程序集内使用 internal 成员。
  6. 编译代码。

理解内部访问修饰符

C# 中的 internal 关键字/访问修饰符限制了某个类型或成员的可见性,仅限于同一程序集内的其他成员。 这意味着任何类、无论是继承类、方法或属性标记为 internal,都可以被同一程序集内的其他类型访问,但无法被程序集外的类型访问。 这种访问控制程度对于封装非常重要,因为它让您能够以私密的方式指定仅在同一程序集内部使用的实现细节。

在 C# 中,您可以以以下方式使用 internal 修饰符:

内部类

使用 internal 声明一个仅在同一程序集内可用的类。

// Assembly1
internal class InternalClass
{
    // Members of InternalClass
}
// Assembly1
internal class InternalClass
{
    // Members of InternalClass
}
$vbLabelText   $csharpLabel

内部类成员

通过应用 internal 限制类成员(如字段、属性和方法)的可见性到同一程序集。

// Assembly1
internal class MyClass
{
    internal static int InternalField;
    internal void InternalMethod() { }
}
// Assembly1
internal class MyClass
{
    internal static int InternalField;
    internal void InternalMethod() { }
}
$vbLabelText   $csharpLabel

内部接口

使用 internal 访问修饰符声明一个只能在同一程序集内访问的接口。

// Assembly1
internal interface IInternalInterface
{
    // Interface members
}
// Assembly1
internal interface IInternalInterface
{
    // Interface members
}
$vbLabelText   $csharpLabel

内部嵌套类

使用 internal 声明一个只能在同一程序集内访问的嵌套类。

// Assembly1
public class OuterClass
{
    internal class InternalNestedClass
    {
        // Members of InternalNestedClass
    }
}
// Assembly1
public class OuterClass
{
    internal class InternalNestedClass
    {
        // Members of InternalNestedClass
    }
}
$vbLabelText   $csharpLabel

内部程序集

通过在程序集级别应用 internal 限制外部程序集的访问。

using System.Runtime.CompilerServices;

// Allowing "ExternalAssembly" to access internal members of this assembly
[assembly: InternalsVisibleTo("ExternalAssembly")]
using System.Runtime.CompilerServices;

// Allowing "ExternalAssembly" to access internal members of this assembly
[assembly: InternalsVisibleTo("ExternalAssembly")]
$vbLabelText   $csharpLabel

在开发和测试过程中,可以通过使用 InternalsVisibleTo 属性,使内部访问修饰符对指定的外部程序集可用。

// Assembly A
public class MyClassA
{
    internal void MyInternalMethod()
    {
        // Implementation details only accessible within Assembly A
    }
}

// Assembly B
public class MyClassB
{
    void SomeMethod()
    {
        MyClassA myObject = new MyClassA();
        myObject.MyInternalMethod(); // This will result in a compilation error
    }
}
// Assembly A
public class MyClassA
{
    internal void MyInternalMethod()
    {
        // Implementation details only accessible within Assembly A
    }
}

// Assembly B
public class MyClassB
{
    void SomeMethod()
    {
        MyClassA myObject = new MyClassA();
        myObject.MyInternalMethod(); // This will result in a compilation error
    }
}
$vbLabelText   $csharpLabel

在此示例中,由于 MyInternalMethod 被指定为内部成员,因此只能在程序集 A 中访问。 如果您尝试从程序集 B 访问此函数,将会发生编译错误。

结合 protected 和 internal 访问修饰符会产生 protected internal 访问修饰符。 通过 protected internal 复合访问修饰符,派生类型可以在其程序集内部和外部访问一个成员(方法、属性或字段)或一个类型(类、接口或委托)。 protected internal 访问级别在保护和 internal 访问级别分别提供的可见性之间提供了平衡。

IronPDF。

使用 C# 编程语言,IronPDF 官方网站 是一个 .NET 库,使开发人员能够生成、编辑和修改 PDF 文档。 它提供了多种工具和功能,以多种方式与 PDF 文件交互,包括从 HTML 创建 PDF,将 HTML 转换为 PDF,合并或拆分 PDF 文档,以及为现有 PDF 附加注释、文本和照片。

安装IronPDF

获取 IronPDF 库; 这对于将来的补丁是必需的。 在包管理器控制台中输入以下命令以完成此操作:

Install-Package IronPdf

C# Internal(开发者如何工作):图 1 - 安装 IronPDF

使用 NuGet 包管理器搜索包 "IronPDF" 是另一种选择。我们可以从与 IronPDF 相关的所有 NuGet 包列表中选择并下载所需的包。

C# Internal(开发者如何工作):图 2 - IronPDF 包

IronPDF在HTML到PDF转换方面表现出色,确保精确保留原始布局和样式。 它非常适合从基于Web的内容中创建PDF,如报告、发票和文档。 利用对HTML文件、URL和原始HTML字符串的支持,IronPDF轻松生成高质量的PDF文档。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPDF。的功能

*将 HTML 转换为 PDF:使用 IronPDF,您可以从任何类型的 HTML 信息(包括文件、URL 和 HTML 代码字符串)创建 PDF 文档。

  • PDF 生成:使用 C# 编程语言,您可以以编程方式向 PDF 文档添加文本、图形和其他组件。
  • PDF 操作: IronPDF 提供将 PDF 文件分割成多个文件、将多个 PDF 文档合并成一个文件以及修改现有 PDF 的功能。
  • PDF 表单:该库在需要收集和处理表单数据的情况下非常有用,因为它允许用户创建和填写 PDF 表单。 *安全功能:* PDF 文档可使用 IronPDF 进行密码和权限保护和加密。 文本提取:** IronPDF 可用于从 PDF 文件中提取文本。

PDF 处理的封装与 IronPDF

IronPDF 提供了生成、修改和处理 PDF 文档的广泛功能。 通过将 PDF 处理代码封装在内部类或方法中,可以将实现细节隐藏在程序集中。 要了解更多 IronPDF 的信息,请参阅 IronPDF 文档

检查以下情况:

// Assembly A (PDFHandlingLibrary)
internal class PdfProcessor
{
    internal void AddWatermark(IronPdf.PdfDocument pdfDocument, string watermarkText)
    {
        // Implementation details for adding a watermark using IronPDF
    }

    internal IronPdf.PdfDocument MergePdfDocuments(IEnumerable<IronPdf.PdfDocument> pdfDocuments)
    {
        // Implementation details for merging PDF documents using IronPDF
        IronPdf.PdfDocument mergedPdfDocument = new IronPdf.PdfDocument();
        // Logic to merge documents
        return mergedPdfDocument;
    }
}

// Assembly B (MainApplication)
public class MainClass
{
    void ProcessPdfDocuments()
    {
        // Create an instance of the PdfProcessor within the same assembly
        PdfProcessor pdfProcessor = new PdfProcessor();

        // Assuming pdfDocumentList is defined
        IEnumerable<IronPdf.PdfDocument> pdfDocumentList = new List<IronPdf.PdfDocument>();

        // Accessing internal methods within the same assembly is allowed
        pdfProcessor.AddWatermark(new IronPdf.PdfDocument(), "Confidential");
        IronPdf.PdfDocument mergedPdf = pdfProcessor.MergePdfDocuments(pdfDocumentList);
    }
}
// Assembly A (PDFHandlingLibrary)
internal class PdfProcessor
{
    internal void AddWatermark(IronPdf.PdfDocument pdfDocument, string watermarkText)
    {
        // Implementation details for adding a watermark using IronPDF
    }

    internal IronPdf.PdfDocument MergePdfDocuments(IEnumerable<IronPdf.PdfDocument> pdfDocuments)
    {
        // Implementation details for merging PDF documents using IronPDF
        IronPdf.PdfDocument mergedPdfDocument = new IronPdf.PdfDocument();
        // Logic to merge documents
        return mergedPdfDocument;
    }
}

// Assembly B (MainApplication)
public class MainClass
{
    void ProcessPdfDocuments()
    {
        // Create an instance of the PdfProcessor within the same assembly
        PdfProcessor pdfProcessor = new PdfProcessor();

        // Assuming pdfDocumentList is defined
        IEnumerable<IronPdf.PdfDocument> pdfDocumentList = new List<IronPdf.PdfDocument>();

        // Accessing internal methods within the same assembly is allowed
        pdfProcessor.AddWatermark(new IronPdf.PdfDocument(), "Confidential");
        IronPdf.PdfDocument mergedPdf = pdfProcessor.MergePdfDocuments(pdfDocumentList);
    }
}
$vbLabelText   $csharpLabel

在此示例中,程序集 A 的 PdfProcessor 类使用 IronPDF 封装了 PDF 处理代码。 由于这些方法被指定为 internal,因此只能由同一程序集的其他 internal 成员访问。 程序集 B 的 MainClass 可以轻松地使用这些 internal 函数。 要了解更多 IronPDF 代码的信息,请参阅 IronPDF HTML 到 PDF 示例

C# Internal(开发者如何工作):图 3 - 输出

结论

最后,C# internal 修饰符提供了对程序集内可见的类型和成员的强大控制。 它有助于在与 IronPDF 结合使用的情况下创建安全、模块化和可维护的应用程序。 通过将与 IronPDF 相关的代码封装在内部类或方法中,您可以在抽象、安全性和可用性之间取得妥协。 在处理像 IronPDF 这样管理重要功能(例如 PDF 文档处理)的库时,尤其重要的是采用封装和受限访问的概念,以便在 C# 应用程序中促进稳定和可扩展的架构。

IronPDF 的 $799 轻量版包包括一个非常强大的许可证、重新设计选项和更长时间的编程支持。 客户可以在水印测试期间在实际应用环境中测试该产品。 了解更多关于 IronPDF 许可证 的信息,以了解其优势、审批流程和草拟形式。 查看 Iron Software 网站了解更多信息。

常见问题解答

C# 中的 internal 关键字如何增强封装?

C# 中的 internal 关键字通过将类型或成员的可见性限制在同一程序集内,从而阻止外部程序集访问内部实现细节。这促进了代码库的更清洁架构和可维护性。

InternalsVisibleTo 属性在 C# 中的作用是什么?

C# 中的 InternalsVisibleTo 属性允许您向指定的外部程序集授予对程序集的内部成员的访问权限。这在测试时特别有用,因为它允许测试程序集访问内部成员进行验证,同时在发布期间保持封装。

可以在 C# 中使用 internal 访问修饰符进行 PDF 处理吗?

是的,internal 访问修饰符可以与诸如 IronPDF 之类的库结合使用,将 PDF 处理逻辑封装在一个程序集内。这确保了敏感的 PDF 操作功能不对外部暴露,增强了安全性和可维护性。

C# 中 internal 关键字的一些常见用例是什么?

C# 中 internal 关键字的常见用例包括限制对内部类、方法和属性的访问,尤其是在构建模块化组件如图形用户界面时,或在使用 IronPDF 等库封装业务逻辑以进行 PDF 文档管理时。

如何使用 C# 将 HTML 转换为 PDF?

您可以通过使用 IronPDF 来使用 C# 将 HTML 转换为 PDF。该库提供诸如 RenderHtmlAsPdf 的方法将 HTML 字符串转换为 PDF 文档,还有 RenderHtmlFileAsPdf 直接转换 HTML 文件。

在库开发中使用 internal 访问修饰符的好处是什么?

在库开发中使用 internal 访问修饰符提供的好处包括通过将敏感的实现细节隐藏在外部程序集之外来增强安全性,并通过将复杂的逻辑封装在库中并仅公开必要的接口来提高可维护性。

在 PDF 处理过程中如何利用 IronPDF 进行文档安全?

IronPDF 可以在 PDF 处理过程中通过应用密码保护、加密和访问控制等功能来增强文档安全性,确保只有授权用户才能查看或修改在安全环境下生成或操作的 PDF 文档。

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

Jacob Mellor 是 Iron Software 的首席技术官,是 C# PDF 技术的先锋工程师。作为 Iron Software 核心代码库的原始开发者,自公司成立以来,他就塑造了公司的产品架构,并与首席执行官 Cameron Rimington 一起将其转变成一家公司,拥有50多人,服务于 NASA、特斯拉和全球政府机构。

Jacob 拥有曼彻斯特大学 (1998-2001) 的一级荣誉土木工程学士学位。1999 年在伦敦创办了自己的第一家软件公司,并于 2005 年创建了他的第一个 .NET 组件后,他专注于解决微软生态系统中的复杂问题。

他的旗舰 IronPDF 和 Iron Suite .NET 库在全球已获得超过 3000 万次的 NuGet 安装,其基础代码继续为全球使用的开发者工具提供支持。拥有 25 年商业经验和 41 年编程经验的 Jacob 仍专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。