85
internal class Foo
{
  public void Fee()
  {
    Debug.WriteLine("Fee");
  }

  internal void Fi()
  {
    Debug.WriteLine("Fi");
  }
}

クラス全体がすでに内部にあるため、 Fee() と Fi() は等しくアクセスできると考えています。私は何かを見落としていますか?このような場合、メソッドに public または internal を選択する理由はありますか?

4

7 に答える 7

99

宣言はメソッドのinternal class Fooアクセシビリティをオーバーライドしpublic void Fee()、効果的に内部化します。

この場合、メソッドで internal と public を使用しても同じ効果があります。このような場合にパブリック メソッドと内部メソッドを選択する唯一の理由は、将来のバージョンでパブリック クラスへの移行を容易にするためです。

于 2009-04-02T20:06:22.493 に答える
36

ここで答えに欠けているのは、なぜこれを行うのかということだけです。

一部のライブラリには、ライブラリの利用者が触れることを目的としていないクラスがたくさんありますが、パブリックとしてマークされたインターフェイスを継承する必要があります。たとえば、IComparerインターフェイスを継承するクラスを持つライブラリがありますが、それは内部でのみ使用され、ライブラリのパブリックな側面を乱雑にしたくありません。実装されたCompare関数を内部としてマークすると、コンパイラは、インターフェイスIComparerを実装していないと文句を言います。

では、どうすればインターフェイスを正常に実装し、同時にライブラリのパブリックな側面でインターフェイスにアクセスできないようにすることができますか?クラスを内部としてマークしますが、実装された関数はパブリックとしてマークします。

于 2009-07-11T19:01:02.863 に答える
30

実際、リフレクションを使用している場合は大きな違いがあります。特に、たとえアクセスできたとしても、リフレクションを介して内部メソッドにアクセスしようとすると、Silverlight は非常に混乱する可能性があります。コードが通常の .NET で動作する場合でも、コードを Silverlight で動作させるためにメソッドを公開する必要がある場合を見てきました。

通常の .NET の部分的な信頼でも同じことがわかる場合があります。

于 2009-04-02T22:56:13.973 に答える
9

内部クラスにインターフェイスを実装する場合は、違いが生じます。何らかのインターフェースの実装であるメソッドは、Public でなければなりません。

于 2012-04-19T11:20:23.127 に答える
7

あなたは正しいです、料金とFiの両方が等しくアクセス可能になります。

CSharp言語仕様3.0から、3.5.2の下で:

プログラムP内のタイプTで宣言されたネストされたメンバーMのアクセシビリティドメインは、次のように定義されます(M自体がタイプである可能性があることに注意してください)。

•宣言されたMのアクセシビリティドメインがパブリックである場合、MのアクセシビリティドメインはTのアクセシビリティドメインです。

したがって、Feeがパブリックとして宣言されている場合でも、Foo(つまり内部)と同じようにアクセスできます。

于 2009-04-02T20:24:33.307 に答える
3

msdn のドキュメントによると、Foo クラスはアセンブリの外ではアクセスできないため、メソッドを internal または public としてマークしても違いはありません。属性 InternalsVisibleTo を使用しても違いはありません

于 2009-04-02T20:07:01.010 に答える
1

クラスが内部の場合、内部メソッドのみを使用します。気が変わってクラスを公開する場合は、テキストを置き換えるだけで完了です。

于 2010-12-20T09:37:55.753 に答える