C# 7.2 引入了 private protected 修饰符 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/private-protected.
我始终保护对具有属性的字段的访问,允许通过 Get/Set 方法进行访问,因为我通常不希望对象的内部状态被我自己的类以外的任何内容修改。
我试图理解为什么 C# 语言团队添加了此功能。经过谷歌的广泛搜索,阅读和观看“最新消息”媒体(我看过, details https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7-2 and 视频由麦兹·托格森拍摄 https://channel9.msdn.com/events/Connect/2017/T122),我还是一无所知。
对我来说,这似乎允许开发人员打破里氏替换原则,但这可能是因为我不明白为什么现在存在此功能。
我知道它是如何使用的,只是不知道为什么 - 请有人提供一个真实的使用示例,而不是 MSDN 文档中的人为示例?
在 C# 7.2 之前,我们有protected internal
修饰符。这实际上意味着受保护或内部,即 - 成员A
子类以及当前程序集中的任何类都可以访问,即使该类不是类的子类A
(因此放宽了“受保护”暗示的限制)。
private protected
真正意味着受保护和内部。也就是说,成员只能被同一程序集中的子类访问,而不能被程序集外部的子类访问(因此“受保护”隐含的限制被缩小 - 变得更加严格)。如果您在程序集中构建类的层次结构并且不希望其他程序集中的任何子类访问该层次结构的某些部分,那么这非常有用。
我们可以举个例子乔恩·斯基特 https://stackoverflow.com/users/22656/jon-skeet假如在评论中 https://stackoverflow.com/questions/47430491/what-is-the-use-case-for-the-c-7-2-private-protected-modifier/47430648#comment81815595_47430491。假设你有课
public class MyClass {
}
并且您希望只能在当前程序集中继承它,但不希望允许直接实例化此类,除非在此类层次结构中。
仅在当前程序集中继承可以通过内部构造函数来实现
public class MyClass {
internal MyClass() {
}
}
可以使用受保护的构造函数来防止除当前类层次结构之外的直接实例化:
public class MyClass {
protected MyClass() {
}
}
为了两者兼得 - 你需要private protected
构造函数:
public class MyClass {
private protected MyClass() {
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)