C#のアクセシビリティ(アクセスのしやすさ)

全ての型(クラス、構造体、インターフェース、列挙型など)や、型のメンバー(フィールドメソッド、イベントなど)にはアクセシビリティ(アクセスのしやすさ)のレベルがあります。

型やメンバーを宣言する時にアクセス修飾子を付ける事でアクセシビリティレベルを指定します。



アクセシビリティレベルの種類

アクセシビリティレベルには以下のような種類があります。
修飾子概要
public他のコードどこからでもアクセスが可能
private同じクラス内のコードからのみアクセスが可能
protected同じクラス内のコードと派生クラスのコードからのみアクセスが可能
internal同じアセンブリ(EXEやDLL)のコードからはアクセス可能
(他のアセンブリからはアクセス不可)
protected internal同じアセンブリの場合、どこからでもアクセス可能
他のアセンブリの場合、派生クラスのコードからのみアクセスが可能
private protected同じクラス内のコードと派生クラスのコードからで
かつ同じアセンブリのコードからのみアクセス可能

サンプル

public class Person
{
    public    string Nickname;
    protected string Name;
    private   int    Age;


    public void Test1()
    {
        Nickname = "イチロー";  // アクセス可
        Name     = "一朗";      // アクセス可
        Age      = 10;          // アクセス可
    }
}

public class PersonEx : Person  // 派生クラス
{
    public void Test2()
    {
        Nickname = "イチロー";  // アクセス可
        Name     = "一朗";      // アクセス可
//      Age      = 10;          // アクセス不可
    }
}

public class Program
{
    public static void Main()
    {
        Person p = new Peason();

        p.Nickname = "イチロー";  // アクセス可
//      p.Name     = "一朗";      // アクセス不可
//      p.Age      = 10;          // アクセス不可
    }
}



アクセス修飾子が省略された場合

アクセス修飾子を省略して型やメンバーが宣言された場合は以下のようになります。

名前空間に直接宣言された型(入れ子にされていないクラスや構造体など)の場合は internal になります。
入れ子になった型(クラスの中に宣言されたクラスなど)やメンバーの場合は private になります。



アクセス修飾子の使い分け

アクセス修飾子を適切に使い分ける事で、ソースコードのメンテナンスが格段に楽になります。

例えば、仕様変更により既存のメソッドにパラメータを追加しなけらばならなくなったとします。
public で宣言されたメソッドだったなら、プロジェクト全体に加えてこのアセンブリを参照している全てのプロジェクトでメソッドの利用箇所を調べて変更する必要があります。
対して private で宣言されたメソッドであれば、利用箇所はそのクラス内に限られます。
そのクラス内で正しく動作する事が確認できれば良いわけです。



コメント