プライベートと保護された内部アクセス指定子の実際の違いを知りたいだけです。私の知る限り
所有するクラス メンバーに表示: private および protected internal YES
他のクラスのオブジェクトから見える:両方NO
名前空間コレクション外の他のクラスのオブジェクトから見える:両方NO
名前空間コレクション外の子クラスのオブジェクトに表示:両方NO
プライベートが保護された内部と同じことをしている場合、なぜ両方が必要なのか、1つだけで十分でしょうか?
プライベートと保護された内部アクセス指定子の実際の違いを知りたいだけです。私の知る限り
所有するクラス メンバーに表示: private および protected internal YES
他のクラスのオブジェクトから見える:両方NO
名前空間コレクション外の他のクラスのオブジェクトから見える:両方NO
名前空間コレクション外の子クラスのオブジェクトに表示:両方NO
プライベートが保護された内部と同じことをしている場合、なぜ両方が必要なのか、1つだけで十分でしょうか?
protected internal
のコードから参照できます。専門用語で言えば、 と の論理和です。protected
internal
private
メンバーは、同じクラス内のコードにのみ表示されます。protected internal
は、実際には に次いで 2 番目に許容度の高いアクセス修飾子public
です。
これは、制御できないコード (つまり、他のアセンブリ) からのアクセスを許可するため、protected
間違いなくより寛容であることに注意してください。現在のアセンブリ内のすべてのコードからアクセスできますが、internal
このコードはあなたのものであり、制御できます。internal
言い換えると、protected
(およびprotected internal
) メンバーは、アセンブリのパブリック API の一部です (したがって、文書化する必要があります)。internal
メンバーではありません。
private
は自分のクラス メンバーにのみprotected internal
表示されますが、子クラスだけでなく名前空間コレクション内の他のクラスにも表示されます。
プライベート
型またはメンバーは、同じクラスまたは構造体のコードによってのみアクセスできます。
保護された内部
型またはメンバーには、同じアセンブリ内の任意のコード、または別のアセンブリ内の任意の派生クラスからアクセスできます
実際には、私は通常、変数にprivateを使用して、他のクラスで誤用されないようにします。
内部で保護されていますが、他のほとんどのクラスでは使用できないが、テストケースを作成するためにアクセスできるようにしたいメソッドによく使用します。テストクラスを適切な名前空間またはパッケージ構造で作成し、保護された内部メソッドに不適切に公開することなくアクセスできるという点で非常に便利です。
このアプローチでは、簡単に「テスト可能な」コードを書くことが優先されるコーディングへのアプローチが必要です。これが私のアプローチではなかった場合、保護された内部を使用する機会がたくさんあるかどうかはわかりません。
protected internal は、継承して同じアセンブリにあるクラスのみがそのプロパティを見ることができることを意味すると思います。クラスを派生させ、別のアセンブリからのものは、それを見ることができません。
LE: これについては Mattias Buelens のコメントを読んでください。
さまざまなフォーラムやブログで提供されている説明を読んで、.NET コンテキストでの保護された内部と内部の違いを理解しようとしていました。私は本当に理解できなかったので、VS2015を使用して2つの別個のアセンブリを作成しました。おそらく今、私は基本的な理解を持っています。どなたかの参考になるかもしれませんので、シェアさせていただきます。あるアセンブリで宣言されたフィールドを別のアセンブリから使用しようとしました。また、別のアセンブリで宣言されたクラスから派生しようとしました。アセンブリ 1 の class1.cs のコードを次に示します。
namespace Z_Dll_1
{
public class PublicBaseClassAssemblyOne
{
internal int _myinternal = 200;
protected internal int _protectedinternal = 100;
protected int _myProtected = 123;
private int _myPrivate = 2;
public int _myPublic = 45;
}
public class DerivedClassAssemblyOne : PublicBaseClassAssemblyOne
{
protected internal int intM = 10;
}
internal class MyInternalClass
{
public void MyMethod()
{
Console.WriteLine("Method one with internal class");
PublicBaseClassAssemblyOne cl1 = new PublicBaseClassAssemblyOne();
cl1._myinternal = 1000; //Internal type is available since it is in same assembly
cl1._protectedinternal = 10; // protected internal is available
cl1._myPublic = 2; // Public OK
//cl1.myPrivate = ?? // nor available since it is private
DerivedClassAssemblyOne drOne = new DerivedClassAssemblyOne();
drOne._myinternal = 30; // Internal and available from derived class
drOne._myPublic = 1; // Public
drOne._protectedinternal = 2; // Able to be accessed from same assembly or derived class from other assembly
}
}
}
Z_Dll_1 を使用した別のアセンブリ class2.cs のコードを次に示します。
namespace Z_Dll_2
{
public class ClassAssembly2
{
public ClassAssembly2()
{
PublicBaseClassAssemblyOne classfromOtherAssembly = new PublicBaseClassAssemblyOne();
classfromOtherAssembly._myPublic = 0; //Only public is available
}
}
public class ClassDerivedFromOtherAssemblyClass : PublicBaseClassAssemblyOne
{
public ClassDerivedFromOtherAssemblyClass()
{
}
void ClassDerivedFromOtherAssemblyClassTestMethod()
{
//_myinternal = 200; // can't access since it was internal to other assembly
_protectedinternal = 100; // this can be accessed as it is derived class from other class that has protected internal
_myProtected = 123; // Ordinary protected data accessed from derived class
//_myPrivate = 2; //Private member can't be accessed from derived class
_myPublic = 45; // Public can be accessed anyway
//Try to create an instance of internal class
//MyInternalClass intClass = new MyInternalClass(); //Not accessible from this assembly
}
}
}