誰かが C#の修飾子protected
と修飾子の違いを説明できますか? protected internal
彼らの行動は同じように見えます。
11 に答える
「保護された内部」アクセス修飾子は、「保護された」修飾子と「内部」修飾子の両方の結合です。
MSDNから、アクセス修飾子 (C# プログラミング ガイド) :
型またはメンバーは、同じクラスまたは構造体、またはそのクラスから派生したクラス内のコードによってのみアクセスできます。
内部:
型またはメンバーは、同じアセンブリ内の任意のコードからアクセスできますが、別のアセンブリからはアクセスできません。
保護された内部:
型またはメンバーは、それが宣言されているアセンブリ内の任意のコードから、または別のアセンブリ内の派生クラス内からアクセスできます。別のアセンブリからのアクセスは、保護された内部要素が宣言されているクラスから派生したクラス宣言内で行う必要があり、派生クラス型のインスタンスを介して行う必要があります。
:protected internal
は " protected
OR internal
" (同じアセンブリ内の任意のクラス、または任意の派生クラス - 異なるアセンブリ内であっても) を意味することに注意してください。
...そして完全を期すために:
型またはメンバーは、同じクラスまたは構造体のコードによってのみアクセスできます。
公開:
型またはメンバーには、同じアセンブリまたはそれを参照する別のアセンブリ内の他のコードからアクセスできます。
アクセスは、現在のアセンブリ内の包含クラスまたは包含クラスから派生した型に制限されます。
( C# 7.2 以降で利用可能)
protected
任意のアセンブリの任意のサブクラスで使用できます。
protected internal
がすべてでprotected
あり、同じアセンブリ内のすべてのものにアクセスできます。
重要なことに、これは「同じアセンブリ内のサブクラス」を意味するものではありません。これは 2 つの結合であり、交差ではありません。
実際には、方法について:
protected - 継承されたクラスにアクセスできます。それ以外の場合は非公開です。
internal - アセンブリ内のクラスに対してのみパブリック、それ以外はプライベート。
保護された内部- 保護または内部を意味します - メソッドは、継承されたクラスおよびアセンブリ内のすべてのクラスに対してアクセス可能になります。
これらの用語の非常に明確な定義を読み上げました。
Protected : アクセスは、クラス定義およびそのクラスから継承するすべてのクラス内に制限されます。型またはメンバーは、同じクラスまたは構造体、またはそのクラスから派生したクラス内のコードによってのみアクセスできます。
内部 : アクセスは、現在のプロジェクト アセンブリ内で定義されたクラスのみに制限されます。型またはメンバーは、同じクラス内のコードによってのみアクセスできます。
Protected-Internal : アクセスは、現在のアセンブリまたは含まれるクラスから派生した型に制限されます。
public -publicとして宣言されたメンバー(関数と変数)には、どこからでもアクセスできます。
private-クラスの外部からプライベートメンバーにアクセスすることはできません。これは、メンバーのデフォルトのアクセス指定子です。つまり、メンバー(変数または関数)のアクセス指定子を指定しない場合、プライベートと見なされます。したがって、文字列PhoneNumber; プライベート文字列PhoneNumberと同等です。
保護-保護されたメンバーには、子クラスからのみアクセスできます。
内部-同じアセンブリ内でのみアクセスできます。
保護された内部-同じアセンブリ内および派生クラス内でアクセスできます。
同じフィールド、プロパティ、またはメソッドにprotected internal
2 つのアクセス修飾子 ( protected
、および) を適用すると考えてください。internal
現実の世界では、人々が博物館を訪れる特権を発行していると想像してください。
- 市内の誰もが博物館を訪れることができます(内部)。
- 両親がここに住んでいる市外のすべての人は、博物館を訪れることができます(保護されています)。
そして、これらを次のようにまとめることができます。
市内のすべての人 (internal) と市外の両親が住んでいるすべての人 (protected internal) は、博物館を訪れることができます ( protected internal )。
プログラミングの世界:
internal : フィールドは、アセンブリ (プロジェクト) のどこでも使用できます。これは、プロジェクト スコープ内にあると言っているようなものですpublic
(ただし、そのクラスから継承するアセンブリ外のクラスからでも、プロジェクト スコープ外にアクセスすることはできません)。そのタイプのすべてのインスタンスは、そのアセンブリ (プロジェクト スコープ) でそれを見ることができます。
protected : すべての派生クラスが (アセンブリの内部または外部で) それを参照できることを単に意味します。たとえば、派生クラスは、次を使用して、メソッドおよびコンストラクター内のフィールドまたはメソッドを表示できますbase.NameOfProtectedInternal
。
したがって、これら 2 つのアクセス修飾子を一緒にすると ( protected internal
)、プロジェクト内で公開できるものがあり、スコープ内でそのクラスから継承されたものから見ることができます。
で書いても意味は変わりません
internal protected
が、 と書いたほうが便利です。protected internal