C# 7.2 introduces the private protected modifier

我一直保护对具有属性的字段的访问,允许通过Get/Set方法进行访问,因为我通常不希望对象的内部状态被我自己的类以外的任何东西修改.

我试图理解为什么C语言团队添加了这个功能.在谷歌上进行了广泛的搜索,阅读并观看了"新事物"媒体(我已经观看了press releasedetailsvideo by Mads Torgerson),我仍然没有变得更聪明.

在我看来,这似乎允许开发人员打破Liskov替换原则,但这可能是因为我不明白为什么现在存在这个特性.

我理解它是如何使用的,只是不理解为什么——请有人提供一个真实世界的使用示例,而不是MSDN文档中的人为示例?

推荐答案

在C#7.2之前,我们有protected internal个修饰语.这实际上意味着受保护的或内部的,也就是说,子类和当前程序集中的任何类都可以访问成员A,即使该类不是类A的子类(因此"受保护"所隐含的限制被放宽).

private protected真的意味着受保护的和内部的.也就是说,成员只对同一程序集中的子类可访问,而对程序集外部的子类不可访问(因此"受保护"所暗示的限制被缩小了-变得更加严格).如果您在程序集中构建类的层次 struct ,且不希望其他程序集中的任何子类访问该层次 struct 的某些部分,这将非常有用.

我们可以举Jon Skeet提供in comments的例子.假设你有课

public class MyClass {

}

您希望仅在当前程序集中从它继承,但不希望允许直接实例化这个类,除非是从这个类层次 struct 中.

只能通过内部构造函数在当前程序集中实现继承

public class MyClass {
    internal MyClass() {
    }
}

使用受保护的构造函数可以防止直接实例化,除非使用当前类层次 struct :

public class MyClass {
    protected MyClass() {
    }
}

要实现这两个目标,你需要private protected个构造器:

public class MyClass {
    private protected MyClass() {
    }
}

.net相关问答推荐

在 F# 中处理 Option - Some(null) 的好策略是什么

Puppeteer LaunchAsync 在未打开浏览器的情况下挂起

信号量的多线程问题

什么是提升运算符?

在 .NET C# 中存储加密密钥的最佳方式

将屏幕捕获为位图

.NET 等价于旧的 vb left(string, length) 函数

msbuild,定义条件编译符号

为什么 .NET 中不需要 Maven?

Convert.ToBoolean 和 Boolean.Parse 不接受 0 和 1

如何从 .NET 中的流中获取 MemoryStream?

Moq - 不可覆盖的成员不能用于设置/验证表达式

将字典值转换为数组

从 C# 中的字符串中删除最后一个字符.优雅的方式?

C# 中的 F# List.map 类似功能?

.NET 的 XPath 和 XSLT 2.0?

根据条件从列表中删除项目

.NET 图形库?

程序员应该使用 SSIS,如果是,为什么?

如何使用匿名方法返回值?