如何在C#中创建含internal required成员的公共类以保护程序集信息?
问题分析与解决方案
你遇到的报错本质是公共类的internal required成员存在设计矛盾:required修饰符强制要求实例化类时必须初始化该成员,但internal访问修饰符又限制了外部程序集无法访问这个成员,导致外部无法满足初始化要求,编译器自然报错。
要实现“外部仅能访问成员、无法直接初始化或修改,且无需手动定义构造函数”的需求,可以按以下方式调整代码:
方案1:保留公共属性+内部初始化权限
将属性的读取权限开放给外部,初始化权限仅保留给程序集内部,同时移除required修饰符:
public class Person { // 外部可读取,仅内部能初始化 public string? FirstName { get; internal init; } public string? LastName { get; internal init; } }
- 程序集内部可以通过对象初始化器创建实例:
// 同程序集内的代码 var person = new Person { FirstName = "Alice", LastName = "Smith" }; - 外部程序集只能读取
FirstName和LastName,无法修改或初始化这些属性;但外部仍能创建Person的空实例(属性为null)。
方案2:禁止外部实例化(更贴合“保护信息”需求)
如果要完全禁止外部创建Person实例,仅允许通过程序集内部提供的方式获取对象,可以显式声明内部构造函数(仅需一行代码,逻辑更严谨):
public class Person { // 仅内部能调用构造函数,外部无法new Person() internal Person() { } public string? FirstName { get; internal init; } public string? LastName { get; internal init; } }
此时外部程序集只能通过你在程序集内部暴露的工厂方法等方式获取Person实例,完全无法自行初始化,彻底保护程序集内部的实例创建逻辑。
为什么不能用internal required?
C#的required设计初衷是确保类的实例在创建时必须完成关键成员的初始化,而公共类的核心意义是允许外部程序集使用和实例化。将required成员设为internal,相当于给外部设置了一个无法完成的初始化要求,这违背了两者的设计语义,因此编译器会直接报错。
内容的提问来源于stack exchange,提问作者ProDBdeveloper
相关产品推荐
相关产品推荐

