internal class Foo
{
public void Fee()
{
Debug.WriteLine("Fee");
}
internal void Fi()
{
Debug.WriteLine("Fi");
}
}
クラス全体がすでに内部にあるので、Fee()とFi()は等しくアクセス可能だと思います。私は何かを見落としていますか?このような場合、メソッドにパブリックまたは内部を選択する理由はありますか?
internal class Foo
{
public void Fee()
{
Debug.WriteLine("Fee");
}
internal void Fi()
{
Debug.WriteLine("Fi");
}
}
クラス全体がすでに内部にあるので、Fee()とFi()は等しくアクセス可能だと思います。私は何かを見落としていますか?このような場合、メソッドにパブリックまたは内部を選択する理由はありますか?
回答:
ここで答えに欠けているのは、なぜこれを行うのかということだけです。
一部のライブラリには、ライブラリの利用者が触れることを意図していないクラスがたくさんありますが、パブリックとしてマークされたインターフェイスを継承する必要があります。たとえば、IComparerインターフェイスを継承するクラスを持つライブラリがありますが、それは内部でのみ使用され、ライブラリのパブリックな側面を乱雑にしたくありません。実装されたCompare関数を内部としてマークすると、コンパイラは、インターフェイスIComparerを実装していないと文句を言います。
では、どうすればインターフェイスを正常に実装し、同時にライブラリのパブリックな側面からインターフェイスにアクセスできないようにすることができますか?クラスを内部としてマークしますが、実装された関数はパブリックとしてマークします。
実際、リフレクションを使用している場合は大きな違いがあります。特に、Silverlightは、アクセスできたとしても、リフレクションを介して内部メソッドにアクセスしようとすると、非常に混乱する可能性があります。通常の.NETでは機能しますが、Silverlightでコードを機能させるためにメソッドを公開する必要がある場合があります。
通常の.NETの部分的な信頼でも同じことがわかるかもしれません。
内部クラスにインターフェースを実装させたい場合は、違いが生じます。いくつかのインターフェースの実装であるメソッドは、パブリックでなければなりません。
msdnのドキュメントによると、Fooクラスはアセンブリの外部ではアクセスできないため、メソッドを内部またはパブリックとしてマークしても違いはありません。属性InternalsVisibleToを使用しても違いはありません
クラスが内部の場合は、内部メソッドのみを使用します。気が変わってクラスを公開した場合は、テキストを置き換えるだけで完了です。