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

作为 GitHub 上的 Roslyn文档的一部分,有一个名为 语言特性实现状态的页面,计划为 C # 和 VB 提供语言特性。

我不能理解的一个特性是 private protected访问修饰符:

private protected string GetId() { … }

还有一页的 C # 语言设计笔记,其中解释了许多新的功能,但不是这一个。

埃里克•利珀特(Eric Lippert)在 评论节目中表示:

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

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

12602 次浏览

这只是一个猜测,但是从名字你可能会猜到它是 protected的一个更受限制的版本,(或者更宽松的 private版本,如果你愿意的话)。只有合理的变种是限制 protected的行为装配。

可能的用法: 然后您希望将 protected用于内部实现,而不是用于外部用途(并且您不希望密封该类)。

另外,它一直存在于 CLR,但不是 C # 中,它是 protected 还有 internal的组合,引用:

CLR 还支持“系列和程序集”访问类型。这意味着可以从声明类型、嵌套类型和派生类型中访问该方法,但仅当它们是在同一程序集中声明的。显然,C # 团队并不认为这是一个非常有用的特性,所以这种语言不支持它。

“可能”只对同一程序集中的子类可见,这使得它比 protected受到一些限制。

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

Private protected-“仅当前程序集中的派生类型”

C + +/CLI 有一个类似的特性-定义和使用类和结构(C + +/CLI) > 成员可见性:

private protected-或 -protected private-成员在程序集内部受到保护,但在程序集外部是私有的。

这只是为了提供一个不同可访问性级别的图表(用 http://ashitani.jp/gv/制作)(图片不适合在评论中使用)。

digraph diagram of C# access levels

每个箭头的意思是“比”。

CLR 的名称是 PrivateFamilyANDAssemblyAssemblyFamilyFamilyORAssemblyPublic


后来的编辑: 这个不错的新访问级别(名字很差)最终包含在 C # 6.0中。它只支持 C # 7.2(我看到你更新了你的问题“标签”)。

下面是文恩图表中所有的访问修饰符,从更加有限到更加混乱:

返回文章页面
enter image description here

private protected:-加入了 C # 7.2
enter image description here

返回文章页面
enter image description here

返回文章页面
enter image description here

返回文章页面
enter image description here

返回文章页面
enter image description here

有关“私有保护”特性,请参见 规格:

Private protected 的直观含义是“通过从包含类派生的类型在此程序集中进行访问”。