誰かが私にC#の「保護された」修飾子と「保護された内部」修飾子の違いを詳しく説明してもらえますか?彼らは同じように振る舞うようです。
誰かが私にC#の「保護された」修飾子と「保護された内部」修飾子の違いを詳しく説明してもらえますか?彼らは同じように振る舞うようです。
回答:
「保護された内部」アクセス修飾子は、「保護された」修飾子と「内部」修飾子の和集合です。
以下からのMSDN、アクセス修飾子(C#プログラミングガイド):
保護:
型またはメンバーには、同じクラスまたは構造体のコード、またはそのクラスから派生したクラスのコードによってのみアクセスできます。
内部:
タイプまたはメンバーには、同じアセンブリ内の任意のコードからアクセスできますが、別のアセンブリからはアクセスできません。
保護された内部:
型またはメンバーには、それが宣言されているアセンブリ内の任意のコード、または別のアセンブリの派生クラス内からアクセスできます。別のアセンブリからのアクセスは、保護された内部要素が宣言されているクラスから派生するクラス宣言内で行われる必要があり、派生クラス型のインスタンスを通じて行われる必要があります。
:protected internal
は「protected
OR internal
」を意味することに注意してください(同じアセンブリの任意のクラス、または派生クラス-別のアセンブリにある場合でも)。
...そして完全を期すために:
型またはメンバーには、同じクラスまたは構造体のコードからのみアクセスできます。
公開:
タイプまたはメンバーには、同じアセンブリまたはそれを参照する別のアセンブリ内の他のコードからアクセスできます。
アクセスは、現在のアセンブリ内の包含クラス、または包含クラスから派生したタイプに制限されます。
(C#7.2以降で利用可能)
protected
任意のアセンブリの任意のサブクラスで使用できます。
protected internal
つまりprotected
、すべてが同じであり、さらに同じアセンブリ内のすべてがそれにアクセスできます。
重要なのは、「同じアセンブリ内のサブクラス」を意味するのではなく、交差ではなく、2つの結合です。
private protected
、C#7.2で導入されたアクセス修飾子を使用して達成できます
実際には、メソッドについて:
保護 -継承されたクラスからアクセス可能、それ以外の場合はプライベート。
internal-アセンブリ内のクラスに対してのみパブリック、それ以外の場合はプライベート。
保護された内部 -保護または内部-メソッドは、継承されたクラスおよびアセンブリ内のすべてのクラスからアクセス可能になります。
protected
AND としてメンバーをマークする方法はありinternal
ますか?
protected internal
。
private protected
docs.microsoft.com/en-us/dotnet/csharp/language-reference/...
ほとんどの定義が正しく定義されていますが、「保護された内部」アクセサーの範囲を理解することには、依然として多くの混乱があります。これは、「保護された」と「保護された内部」の混同を理解するのに役立ちました。
publicは、アセンブリの内部と外部で実際にパブリックです(public internal / public external)
protectedは、アセンブリの内側と外側で本当に保護されています(protected internal / protected external)(トップレベルのクラスでは許可されていません)
プライベートは、アセンブリの内部と外部で実際にプライベートです(プライベート内部/プライベート外部)(トップレベルのクラスでは許可されていません)
内部は実際にはアセンブリ内部でパブリックですが、プライベートのようにアセンブリの外部で除外されています(パブリック内部/除外外部)
保護された内部は、実際にはアセンブリ内でパブリックですが、アセンブリの外部で保護されています(パブリック内部/保護された外部)(トップレベルのクラスでは許可されていません)
ご覧のとおり、内部の保護は非常に奇妙な獣です。直感的ではありません。
これで、なぜMicrosoftが(内部保護/外部除外)を作成しなかったのか、ある種の「プライベート保護」または「内部保護」を作成したのではないかという疑問が生じます。笑。不完全なようです?
混乱に加えて、保護型、内部型、またはプライベート型の内部に、パブリックまたは保護された内部のネストされたメンバーをネストできるという事実があります。外部アセンブリアクセスを除外する内部クラス内のネストされた「保護された内部」にアクセスするのはなぜですか?
Microsoftは、そのようなネストされた型は親の型スコープによって制限されると述べていますが、それはコンパイラが言うことではありません。スコープのみをアセンブリに制限する必要がある内部クラス内の保護された内部をコンパイルできます。
私にとってこれは不完全なデザインのように感じます。継承だけでなく、ネストされた型のセキュリティと階層も明確に考慮するシステムに対して、すべての型のスコープを単純化する必要があります。これにより、不完全なスコープシステムに基づいて型とメンバーのアクセス可能性を発見するのではなく、オブジェクトの共有が非常に直感的できめ細かくなります。
保護されたメンバー
クラスのProtected Memberは、含まれているクラス(宣言されているクラス)とアセンブリ内およびアセンブリ外の派生クラスでのみ使用できます。
アセンブリの外部にあるクラスが、そのクラスのみを継承することにより、他のアセンブリの保護されたメンバーを使用できるかどうかを意味します。
そのクラスを継承することでProtectedメンバーをアセンブリの外部に公開し、派生クラスでのみ使用できます。
注:保護されたメンバーは、派生クラスのオブジェクトを使用してアクセスできません。
内部メンバー
クラスの内部メンバーが使用可能であるか、アセンブリ内でオブジェクトを作成するか、派生クラスでアクセスできるか、またはアセンブリ内のすべてのクラスでアクセスできると言えます。
注:オブジェクト作成または派生クラスを使用して、アセンブリの外部から内部メンバーにアクセスすることはできません。
保護された内部
保護された内部アクセス修飾子は、保護または内部の組み合わせです。
保護された内部メンバーは、オブジェクトの作成を宣言したアセンブリ、またはそのクラスを継承したアセンブリ全体で使用できます。また、アセンブリの外部で、派生クラスにのみアクセスできます。
注:保護された内部メンバーは、同じアセンブリ内で内部として機能し、アセンブリの外部では保護されて機能します。
public - publicとして宣言されたメンバー(関数と変数)はどこからでもアクセスできます。
private-クラスの外部からプライベートメンバーにアクセスすることはできません。これは、メンバーのデフォルトのアクセス指定子です。つまり、メンバー(変数または関数)のアクセス指定子を指定しない場合、プライベートと見なされます。したがって、文字列PhoneNumber; プライベート文字列PhoneNumberと同等です。
protected-保護されたメンバーは、子クラスからのみアクセスできます。
内部 -同じアセンブリ内でのみアクセスできます。
保護された内部 -同じアセンブリ内および派生クラス内でアクセスできます。
メンバーまたは型を別のアセンブリの派生クラスで使用すると同時に、宣言されているクラスから派生せずに、親アセンブリのメンバーまたは型を使用する場合の保護された内部の最適なスイート。また、別のクラスから派生せずにメンバーまたは型のみを使用する場合は、同じアセンブリで内部のみを使用できます。
protected internal
ようにするために、メンバーを持つことがprotected
できますか?