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


133

GitHub のRoslynドキュメントの一部として、C#とVBの言語機能が計画されている、言語機能の実装ステータスというページがあります。

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

private protected string GetId() {  } 

C#言語のデザインノートのページもあります。このページには、多くの新機能が説明されていますが、これは説明されていません。

エリックリッパートはコメントで言った:

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

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


2
VB言語のデザインノートの下にそれに関する情報があることに注意してください。
ジェシーグッド

3
これは、MethodAttributes.FamANDAssemへのマッピングです。C#にはinternalの奇妙なマッピングがあり、(Private | FamANDAssem)を使用しています。また、内部保護されたマップを(プライベート|ファミリー)にマップします。CLR属性は奇妙です。
ハンスパッサント2014

22
この提案された機能は私のコメントを不正確にします。
Eric Lippert、2014

C#設計チームは、この機能の代替構文を提案し調査を公開しました。これらのいくつかはprotected & internalassembly protectedやのように興味深いものです(これらのproternalいくつかはジョークだと思います)。いくつかの素晴らしい洞察を含むディスカッションスレッドもあります。
コビ2014年

1
言語機能の実装ステータスで機能が撤回されました。個人的にはこのアクセスレベルの考え方が気に入っており、便利な機能だと思います。クラスの設計に従ってコードを保護するためにprotectedを使用したいのですが、このメンバーにアクセスできるハックなサブレーザーを他の人が作成することは望んでいません。IMO最善の解決策は、私たちが書くことができればだろうprotected | internalprotected & internal
フェリックスKeil社の

回答:


98

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

プライベート保護-「現在のアセンブリ内の派生型のみ」

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

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


72
それは、「保護されていますので、および内部」ではなく「保護のか、内部の」?
user541686 2014

2
メンバーがinternalアセンブリ内のすべてに公開されることを必要とせずに、派生クラスがアクセスできるメンバーが型の物を受け入れたり返したりできるようになりましたか?
スーパーキャット2014

ありがとう!私はそれについて考えていませんでした。私は実際にその修飾子を使用したであろうケースがあり、にフォールバックしましたinternal
Kobi 14

3
この提案/機能の存在は、ことを示唆しているように思われるinternal(クラスが定義されている場所に関連する)視認性は本当に直交しているpublic/ protected/ private(相続に関連する)可視性と、それは、おそらく、internal別に独自の修飾子でなければなりませんpublic/ protected/ private
jpmc26 14

1
@jww-私はJavaにあまり詳しくありませんがpackage、Javaで知っている限り、C#の名前空間に似ています。
Gogutz 2014年

187

ベン図のすべてのアクセス修飾子を以下に示します。

private
ここに画像の説明を入力してください

private protected-C#7.2で追加
ここに画像の説明を入力してください

internal
ここに画像の説明を入力してください

protected
ここに画像の説明を入力してください

protected internal
ここに画像の説明を入力してください

public
ここに画像の説明を入力してください


3
ソース画像:Access Modifiers.pdn。適切な名前のPaint.Netを使用しました。
Kobi 2014

9
これらの図は私の(C#)人生のどこにありますか?彼らは素晴らしいです-ありがとう!
Jon Peterson

28

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

C#アクセスレベルのダイグラフ図

各矢印は「より制限的」であることを意味します。

CLR名はPrivateFamilyANDAssemblyAssemblyFamilyFamilyORAssemblyPublic


かなり後の編集:この素晴らしい新しいアクセスレベル(本当に貧弱な名前のもの)は最終的にC#6.0には含まれていませんでした。C#7.2以降でのみサポートされています(質問の「タグ」が更新されているようです)。


それは私だけかもしれませんが、矢印は「より制限が少ない」方向に向かっているようです。
acarlon 2014

4
@acarlonはい、したがってa → b、図では「aはより制限的b」であることを意味しているので、矢印を「より制限的」であると「読み取る」ことができます(これは、私が説明しようとしたことです)。方向"。ちなみに、矢の反対の慣習も同じように良かったかもしれませんが、私は一つの慣習を選ばなければなりませんでした。
Jeppe Stig Nielsen

10

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

可能な使用法:次にprotected、内部実装に使用したいが、外部使用には使用したくない(そしてクラスをシールしたくない)。

PSそれは常にCLRに存在しましたが、C#には存在しませんでした。これは、の組み合わせだprotected internal、引用:

CLRは、「ファミリとアセンブリ」アクセスタイプもサポートしています。つまり、メソッドは宣言型、ネストされた型、派生型からアクセスできますが、同じアセンブリで宣言されている場合に限られます。まあ、どうやらC#チームはこれを非常に便利な機能とは考えていなかったため、この言語ではサポートされていません。


CLRコメントの+1-最近はC#で多くの時間を費やし、他の.NET言語ではほとんど費やしていないので、同じものではないことを時々忘れます。
brichins 14

@DarrelHoffman注意してくれてありがとう!私はここで自分の考えを少し混乱させました)
Petr Abdulin '30 / 07/30

5

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


1

「プライベート保護」機能の仕様をご覧ください。

プライベートプロテクトの直感的な意味は、「このアセンブリ内で、含まれているクラスから派生した型によってアクセス可能」です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.