计划的"私人保护"是什么意思? C#访问修饰符?

时间:2014-04-04 07:24:12

标签: c# access-modifiers c#-6.0 c#-7.2

作为GitHub上Roslyn文档的一部分,有一个名为Language feature implementation status的页面,其中包含C#和VB的计划语言功能。

我无法绕过的一个功能是private protected访问修饰符:

private protected string GetId() { … } 

还有一个C# Language Design Notes页面,它解释了许多新功能,但不是这个。

Eric Lippert在comment中说:

  

您的错误在于将修饰符视为增加限制。实际上,修饰符总是减少限制。请记住,事情是"私人"默认情况下;只有通过添加修饰符才能减少它们的限制。

private protected的含义是什么?我什么时候可以使用它?

6 个答案:

答案 0 :(得分:177)

以下是维恩图中的所有访问修饰符,从更多限制到更多混杂:

private
enter image description here

private protected: - added in C# 7.2
enter image description here

internal
enter image description here

protected
enter image description here

protected internal
enter image description here

public
enter image description here

答案 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/制作)(图像不适合评论)。

digraph diagram of C# access levels

每个箭头表示"比#34;更具限制性。

CLR名称为PrivateFamilyANDAssemblyAssemblyFamilyFamilyORAssemblyPublic


很久以后编辑:事实证明,这个漂亮的新访问级别(名字真的很差)最终包含在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的直观含义是“可以通过从包含类派生的类型在此程序集中访问”。