作为GitHub上Roslyn文档的一部分,有一个名为Language feature implementation status的页面,其中包含C#和VB的计划语言功能。
我无法绕过的一个功能是private protected
访问修饰符:
private protected string GetId() { … }
还有一个C# Language Design Notes页面,它解释了许多新功能,但不是这个。
Eric Lippert在comment中说:
您的错误在于将修饰符视为增加限制。实际上,修饰符总是减少限制。请记住,事情是"私人"默认情况下;只有通过添加修饰符才能减少它们的限制。
private protected
的含义是什么?我什么时候可以使用它?
答案 0 :(得分:177)
以下是维恩图中的所有访问修饰符,从更多限制到更多混杂:
private
:
private protected
: - added in C# 7.2
internal
:
protected
:
protected internal
:
public
:
答案 1 :(得分:96)
根据" Professional C# 2008"作者:De Bill Evjen和Jay Glynn,第1699页:
private protected - "仅当前程序集中的派生类型"
C ++ / CLI具有类似的功能 - Define and Consume Classes and Structs (C++/CLI) > Member visibility:
private protected
- 或 -protected private
- 成员在程序集内部受到保护,但在程序集外部是私有的。
答案 2 :(得分:26)
这只是为了提供不同辅助功能级别的图形(使用http://ashitani.jp/gv/制作)(图像不适合评论)。
每个箭头表示"比#34;更具限制性。
CLR名称为Private
,FamilyANDAssembly
,Assembly
,Family
,FamilyORAssembly
,Public
。
很久以后编辑:事实证明,这个漂亮的新访问级别(名字真的很差)不最终包含在C#6.0中。它仅受C#7.2支持(我看到你更新了你的问题"标签")。
答案 3 :(得分:9)
这只是一个猜测,但从一个名称你可能会猜到它是protected
的更受限制的版本,(如果你愿意的话,还是private
的更宽松的版本)。并且只有合理的变体才会将protected
行为限制为汇编。
可能的用法:那么你希望protected
用于内部实现,但不能用于外部用途(并且你不想密封该类)。
P.S。它始终存在于CLR, but not in C#中。这是protected
和 internal
的组合,引用:
CLR还支持“家庭和程序集”访问类型。这意味着可以在声明类型,嵌套和派生类型中访问该方法,但前提是它们在同一个程序集中声明。好吧,显然C#团队并不认为这是一个非常有用的功能,所以它不支持这种语言。
答案 4 :(得分:5)
“可能”仅对同一程序集中的子类可见。这使得它比protected
稍微受限制。
答案 5 :(得分:1)
请参阅spec了解“私有保护”功能:
private protected的直观含义是“可以通过从包含类派生的类型在此程序集中访问”。