计划的“私人保护”C#访问修饰符的含义是什么?

作为CodePlex上的Roslyn文档的一部分,有一个称为语言function实现状态的页面,其中包含针对C#和VB的计划语言function。

我不能包裹头部的一个特点是private protected访问修饰符:

 private protected string GetId() { … } 

还有一页C#语言devise笔记 ,它解释了许多新function,但不是这一个。

Eric Lippert在评论中表示 :

你的错误在于将修饰符视为越来越多的限制。 事实上,修饰语总是减less限制。 请记住,事情默认情况下是“私人的” 只有通过添加修饰符,你可以减less限制。

private protected是什么意思? 我什么时候可以使用它?

根据De Bill Evjen和Jay Glynn的“ Professional C#2008 ”,1699页:

私有保护 – “当前程序集中只有派生types”

C ++ / CLI具有类似的function – 定义和使用类和结构(C ++ / CLI)>成员可见性 :

private protected – 或 – protected private – 会员在组装内受到保护,但是在组件外面是私人的。

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

private
在这里输入图像说明

private protected :( * build议function – 目前在C#中不可用)
在这里输入图像说明

internal
在这里输入图像说明

protected
在这里输入图像说明

protected internal
在这里输入图像说明

public
在这里输入图像说明

这只是提供了一个不同的可访问性级别(图片不符合注释)的graphics(用http://ashitani.jp/gv/制作)。;

C#访问级别的二元图

每个箭头意味着“比…更严格”。

CLR名称是PrivateFamilyANDAssemblyAssemblyFamilyFamilyORAssemblyPublic

这只是一个猜测,但从一个名字,你可能会猜测这是一个更受限制的版本的protected ,(或更private版本,如果你愿意的话)。 只有合理的变体才能将受protected行为限制在组装中。

可能的用法:那么你想protected内部实现,但不是外部使用(你不想封闭类)。

PS它始终存在于CLR中,但不在C#中 。 这是protected internal的结合,报价:

CLR还支持“家庭和组装”访问types。 这意味着该方法可以从声明types,嵌套types和派生types中访问,但只能在同一个程序集中声明。 那么,显然C#团队不认为这是一个非常有用的function,所以它不支持这种语言。

“可能”只对相同程序集中的子类可见。 这使得它受到一点限制,而不是protected