在C#7.2之前,我们有protected internal
修饰符。这实际上意味着受保护的OR内部,即-成员A
可被子类以及当前程序集中的任何类访问,即使该类不是该类的子类A
(因此,放宽了“ protected”所隐含的限制)。
private protected
真正意味着受保护且内部的。也就是说,-成员仅可用于同一程序集中的子类,而不能用于外部程序集的子类(因此,“保护”所隐含的限制会更严格-变得更加严格)。如果您在程序集中构建类的层次结构并且不希望其他程序集中的任何子类访问该层次结构的某些部分,则这很有用。
我们可以举Jon Skeet在评论中提供的示例。假设你有课
public class MyClass {
}
而且您只希望能够在当前程序集中从其继承,而又不想允许直接实例化此类,除非从此类层次结构中进行实例化。
内部构造器可以实现仅在当前程序集中进行继承
public class MyClass {
internal MyClass() {
}
}
除了使用当前的类层次结构之外,防止直接实例化可以通过受保护的构造函数来实现:
public class MyClass {
protected MyClass() {
}
}
并获得两者-您需要private protected
构造函数:
public class MyClass {
private protected MyClass() {
}
}