计划的“私人保护”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/制作)。;
每个箭头意味着“比…更严格”。
CLR名称是Private
, FamilyANDAssembly
, Assembly
, Family
, FamilyORAssembly
, Public
。
这只是一个猜测,但从一个名字,你可能会猜测这是一个更受限制的版本的protected
,(或更private
版本,如果你愿意的话)。 只有合理的变体才能将受protected
行为限制在组装中。
可能的用法:那么你想protected
内部实现,但不是外部使用(你不想封闭类)。
PS它始终存在于CLR中,但不在C#中 。 这是protected
和 internal
的结合,报价:
CLR还支持“家庭和组装”访问types。 这意味着该方法可以从声明types,嵌套types和派生types中访问,但只能在同一个程序集中声明。 那么,显然C#团队不认为这是一个非常有用的function,所以它不支持这种语言。
“可能”只对相同程序集中的子类可见。 这使得它受到一点限制,而不是protected
。