.NET ROOM.NET ROOMトップへCOMRADE総合トップへ
「3:デザイン時に自作コントロールの設定を変更する方法」へ

アクセス修飾子の省略

 今回は、アクセス修飾子の省略に関して解説します。
C#ではClass、Interface、Enum、Struct、Delegateなど、さまざまな型がありますが、
これらを宣言するときにアクセス修飾子を省略すると、以下に挙げるようになります。


Namespaceの元や、Namespaceなしで、ネストしていない場合はinternalになる
 この場合、Foo.BarとIFooBarは、暗黙的にinternalになります。
Enum、Struct、Delegateなどでも同様です。

   namespace Foo { class Bar {} }
   interface IFooBar {}

メンバに関してはprivateになる
  このFooBar.fooとFoobar.Ifooはクラスのメンバにあたるため、暗黙的にprivateになります。

   namespace Foo { class Bar { class foo {} } }
   class Foobar { interface Ifoo {} }

 当然、

   class Foo {
    int field;
    void method();
   }

というクラスでは、field、methodは両方ともprivateになります。

ネストしたクラスからの外側のメンバへのアクセス
 この場合、コメントされているほうを実行すると、コメントで記述したようなエラーが発生します(リストA)。
このエラーの通り、直接外側のクラスのメンバを操作することはできません。
ただし、コメントされていないほうのコンストラクタのように、外側のクラスのインスタンス経由では
privateなメンバに対してアクセスすることが可能です。

 なお、クラス、インターフェイス、メンバなどのアクセス修飾子に関しては、
VS.NETのクラスビューやオブジェクトブラウザで確認することができるので、
複雑なケースは確認しながらコーディングをしたほうが安全でしょう。

リストA:ネストしたクラスからの外側のメンバへのアクセス
class OuterClass {
 int outerField;
 class innterClass {
/*
error CS0038: 入れ子になっている型 'OuterClass.innterClass'を経由して、
外の型'OuterClass'のstaticでないメンバにアクセスすることはできません。
  internal innterClass() {
   outerField = 0;
  }
*/
//こちらは可能
  internal innterClass(OuterClass o) {
   innerField = o.outerField;
  }
 }
}



前へ | ページトップへ | 次へ