protected
アクセス指定子とinternal protected
C#の違いは何ですか?
9 に答える
Internal
アセンブリ内に表示されます。
Protected
それが定義されているクラスから継承するクラスから見ることができます。
Protected internal
アセンブリ内またはそれが定義されているクラスから派生した型 (他のアセンブリの型を含む) 内で確認できます。
参照: http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
ページからコピー:
public Access is not restricted.
protected Access is limited to the containing class or types derived from the containing class.
internal Access is limited to the current assembly.
protected internal Access is limited to the current assembly or types derived from the containing class.
private Access is limited to the containing type.
internal
-同じアセンブリ(.dllまたは.exe)内のすべてのものから表示されます。protected
-どこにいても、どのサブクラスでも表示できます。internal protected
-同じアセンブリ内のすべてのサブクラスと、それらがどこにあるかに関係なく、すべてのサブクラスから表示されます。
ジェフ・マットフィールドが「内部はその可視性をさらに低下させる」と言う方法は、それを不明確にします。internal
とprotected
は単に異なる可視性です。両方を一緒にすると、メンバーがより見やすくなります。明示的なアクセス修飾子がないもののデフォルトの可視性は、可能な限り小さくなります。アクセス修飾子を追加すると、常に可視性が向上します。
protected
現在のクラスとその派生クラスのみがメンバーにアクセスできることを意味します。
internal
現在のアセンブリ内のすべてのクラスがメンバーにアクセスできることを意味します。
protected internal
本質的にprotected
または internal
を意味します。つまり、(任意のアセンブリ内の) 現在のクラスから派生するすべてのクラスは、現在のアセンブリ内のすべてのクラスと同様に、メンバーにアクセスできます。これは、多くの開発者が期待していることとは対照的です。これは、and とprotected internal
同じことを意味します(そうではありません)。protected
internal
internal protected
または、protected internal
これは外部protected
(現在のアセンブリの外部から) と内部public
(同じアセンブリ内から) で同じ意味です。
Protected internalおよびprotectedアクセス指定子は、継承の概念に関連しています。
protectedとprotected internalを説明するために例を挙げてみましょう。
名前空間 Aと名前空間 Bという名前の2 つの名前空間があります。
名前空間 Aには、保護されたアクセス指定子を使用するaccept()という名前のメソッドで構成されるclassAという名前のクラスがあります。
名前空間 Bには、名前空間 A のclassAから継承するclassBという名前の別のクラスがあります。
この保護された指定子の助けを借りて、名前空間 BのclassBでそのaccept()メソッドにアクセスできます。
しかし、保護された内部アクセス指定子を使用する場合、その概念は当てはまりません。名前空間 AのclassAのaccept ( )関数が保護された内部アクセス指定子を使用していた場合、名前空間 BのclassBはそれにアクセスできません。同じ名前空間内の継承されたクラス。
internal protected
同じオブジェクトから派生していないクラスから同じアセンブリ内のメンバーにアクセスできますが、別のアセンブリからメンバーにアクセスするために取得する標準の保護されたアクセスも許可します。内部です | protected、not internal & protected (ただし、CLR では後者が許可されていますが、C# では許可されていません)
保護された内部と保護された内部の違いをよりよく理解するには、最初に保護された内部と内部の違いを知ることをお勧めします。
内部変数は同じアセンブリを参照しています。別のアセンブリではアクセスできません。プライベート変数のような保護された変数ですが、同じアセンブリまたは異なるアセンブリの駆動クラスでアクセスできます。
namespace InternalTest ----This namespace in assembly One
{
Public class A
{
B ol=new B();
Console.WriteLine(ol.x);//Output:5
Console.WriteLine(ol.y);//error will occured. Because protected is like Private variable
}
public class B
{
Internal int x=5;
Protected int y=5;
}
}
2) 異なるアセンブリを取ります。
using InternalTest;
namespace InternalTest1 ----This namespace in assembly Two
{
Public class A1:B
{
Public void GetInternalValue()
{ return x; //error can't access because this is internal
}
Public void GetProtectedValue()
{
return y;//Work because it's protected
}
}
public class C
{
}
}
上記の例から、同じアセンブリでは内部にアクセスできますが、別のアセンブリではアクセスできないことが明らかです。同じアセンブリでは、パブリック変数のように見えると言えます。クラスのオブジェクトを作成することで値を割り当てることができます
3)保護された内部は、同じアセンブリ内で両方の利点を持ち、パブリック変数のように見えます。異なるアセンブリでは、保護された変数のように使用します