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

Kob*_*obi 132 c# access-modifiers c#-6.0 c#-7.2

作为GitHub上Roslyn文档的一部分,有一个名为语言功能实现状态的页面,具有C#和VB的计划语言功能.

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

private protected string GetId() { … } 
Run Code Online (Sandbox Code Playgroud)

还有一个C#语言设计笔记页面,它解释了许多新功能,但不是这个.

Eric Lippert在评论中说:

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

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

Kob*_*obi 184

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

private:
在此输入图像描述

private protected: - 在C#7.2中添加
在此输入图像描述

internal:
在此输入图像描述

protected:
在此输入图像描述

protected internal:
在此输入图像描述

public:
在此输入图像描述

  • 这些图表在哪里都是我的(C#)生活?他们很棒 - 谢谢! (8认同)
  • 源图像:[Access Modifiers.pdn](https://www.dropbox.com/s/0uqi1ydxlqovvc9/Access%20Modifiers.pdn).我使用了名为[Paint.Net](http://www.getpaint.net/)的名字. (3认同)

Gog*_*utz 97

根据De Bill Evjen和Jay Glynn撰写的" Professional C#2008 ",第1699页:

private protected - "仅当前程序集中的派生类型"

C++/CLI具有类似的功能 - 定义和消费类和结构(C++/CLI)>成员可见性:

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

  • 那么它是"受保护*和*内部"而不是"受保护*或*内部"? (72认同)
  • 这个提议/特征的存在似乎表明`内部`可见性(与定义类的位置有关)实际上与`public` /`protected` /`private`可见性(与继承相关)正交,并且可能, `internal`应该是它自己的修饰符,与`public` /`protected` /`private`分开. (3认同)
  • 现在可以让一个派生类可以访问的成员接受或返回`internal`类型的东西而不要求成员本身暴露给程序集中的所有东西吗? (2认同)

Jep*_*sen 27

这只是为了提供不同可访问性级别的图形(使用http://ashitani.jp/gv/制作)(图像不适合注释).

C#访问级别的有向图

每个箭头表示"比限制更多".

CLR的名称Private,FamilyANDAssembly,Assembly,Family,FamilyORAssembly,Public.


很久以后编辑:事实证明,这个漂亮的新访问级别(名字真的很差)最终没有包含在C#6.0中.它仅受C#7.2支持(我看到你更新了你的问题"标签").

  • @acarlon是的,所以图中的'a→b`意味着"`a'比'b`更具限制性",所以你可以"读"箭头"比限制更多"(这就是我试图解释的) ),因此箭头指向限制性最小的"方向".顺便说一句,箭头的相反惯例可能同样好,但我必须选择一个惯例. (4认同)

Pet*_*lin 10

这只是一个猜测,但从一个名字你可能会猜到它是一个更受限制的版本protected,(private如果你愿意,还是更宽松的版本).并且只有合理的变体才能将protected行为限制为装配.

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

PS它总是存在于CLR中,但不存在于C#中.它的组合protected internal,报价:

CLR还支持"家庭和程序集"访问类型.这意味着可以在声明类型,嵌套和派生类型中访问该方法,但前提是它们在同一个程序集中声明.好吧,显然C#团队并不认为这是一个非常有用的功能,所以它不支持这种语言.


Meh*_*taş 5

"可能"仅对同一程序集中的子类可见.这使它有点受限制protected.