web-dev-qa-db-ja.com

計画された「プライベート保護された」C#アクセス修飾子の意味は何ですか?

Roslyn GitHubのドキュメントの一部として、C#およびVB向けに計画された言語機能を備えた Language feature implementation status というページがあります。

頭を包むことができなかった機能の1つは、private protectedアクセス修飾子でした。

private protected string GetId() { … } 

C#Language Design Notes のページもあり、多くの新機能について説明していますが、この機能については説明していません。

Eric Lippertは comment で言った:

あなたのエラーは、修飾子を制限の増加と考えることです。実際、修飾子は常に制限を緩和します。物事はデフォルトで「プライベート」であることに注意してください。修飾子を追加することによってのみ、制限が緩和されます。

private protectedの意味は何ですか?いつ使用しますか?

131
Kobi

De Bill EvjenとJay Glynnによる「 Professional C#2008 」、1699ページによると:

private protected-「現在のアセンブリ内の派生型のみ」

C++/CLIにも同様の機能があります- クラスと構造体の定義と消費(C++/CLI)>メンバーの可視性

private protected-または-protected private-メンバーはアセンブリ内で保護されていますが、アセンブリ外ではプライベートです。

96
Gogutz

以下は、より制限的なものからより無差別なものまで、ベン図のすべてのアクセス修飾子です。

private
enter image description here

private protected:- 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

180
Kobi

これは、さまざまなアクセシビリティレベルのグラフ( http://ashitani.jp/gv/ で作成)を提供するためのものです(画像はコメントに収まりません)。

digraph diagram of C# access levels

各矢印は「より制限的」を意味します。

CLR名はPrivateFamilyANDAssemblyAssemblyFamilyFamilyORAssemblyPublicです。


かなり後の編集:このニースの新しいアクセスレベル(名前が非常に悪い)は、最終的にC#6.0に含まれていたnotでした。 C#7.2からのみサポートされます(質問「タグ」を更新しました)。

26

これは単なる推測ですが、名前からは、protectedのより制限されたバージョン(または、必要に応じてprivateのより緩和されたバージョン)であると推測できます。そして、合理的な唯一のバリアントは、protectedの動作をアセンブリに制限することです。

考えられる使用法:protectedを内部実装に使用したいが、外部使用には使用したくない(そしてクラスを封印したくない)。

追伸 CLRではなく、C#ではない に常に存在していました。 protectedandinternalの組み合わせです、引用:

CLRは、「家族とアセンブリ」アクセスタイプもサポートしています。これは、同じアセンブリで宣言されている場合にのみ、宣言型、ネスト型および派生型内からメソッドにアクセスできることを意味します。明らかに、C#チームはこれを非常に便利な機能とは考えていなかったため、この言語ではサポートされていません。

9
Petr Abdulin

「可能」は、同じアセンブリにあるサブクラスにのみ表示されます。これにより、protectedよりも少し制限されます。

5
Mehmet Ataş

「プライベート保護」機能については、 spec をご覧ください。

Private protectedの直観的な意味は、「このアセンブリ内で、包含クラスから派生した型によってアクセス可能」です。

1
Julien Couvreur