C#初心者のための基礎!アクセス修飾子の意味と使い方をわかりやすく解説#18

当サイトではアフィリエイト広告を利用しています。

C#初級プログラミング

アクセス修飾子とは?

アクセス修飾子とは、クラスや変数等のアクセスレベルを制限するために定義して、他のクラスから参照できるか否かを調整するためのキーワードとなります。

アクセス修飾子があるおかげで、変数やクラスが自分のクラスでしか参照できないのか、外部からも参照できるのかを制限できるため、不用意に値を編集される恐れをなくしたり、プログラム修正時の影響範囲の調査の負荷を下げる効果があります。

アクセス修飾子の種類

アクセス修飾子の種類は次の5種類あります。

  • public
  • internal
  • protected
  • protected internal
  • private

の5種類です。

public

publicはどこからでも参照可能となります。自分のクラスからはもちろん、他のクラスからも可能。他のプロジェクトからも、参照設定がされている場合は参照できます。この設定にしておけば、どこからでも見えるので、何も考えなくてもコーディングはできますが、どこからでも参照できている分、コードを修正したくなった場合に、どこまで影響範囲があるのかをチェックしてから、プログラムの修正をする必要があります。同一ソリューションの場合はコンパイルエラーで検知できる可能性がありますが、DLLとして他の会社やソリューションに提供している場合は、実行時にならないとエラーが検知できない可能性があります。安易にpublicにするのではなく、次に解説するinternalにすることができないかを検討し、それでもpublicとして公開する必要がある場合にpublicとしましょう。

Internal

Internalは同一アセンブリであれば参照可能です。同一アセンブリとは、同一のexeファイルや、DLLファイルの事です。VisualStudioのソリューション内であれば、同一プロジェクトという認識で構いません。他のプロジェクトからは、参照設定がされていてもinternalの場合は参照できません。同一のプロジェクトという事は、プログラムの修正が発生した場合も、必ず同時にコンパイルされる環境にあるため、publicのように、dll提供していることまでを視野にいれてプログラム修正をする必要がありません。プログラムを修正する場合も自分自身のプロジェクトのみを意識すればいいので、クラス名や関数名を右クリックで、参照されている箇所を確認すれば、修正後の影響範囲はおのずと確認できます。そういった意味で、publicよりもinternalにすることを第一選択肢として検討し、解決できない場合にpublicを使用しましょう。

protected

protectedは自分のクラスと派生クラスでのみ参照できます。派生クラスとは、継承しているクラスの事で、親子関係の子供側です。親子関係の親のみで使用する場合はprivateとし、子供にも使わせる必要がある場合はprotectedとします。この場合は別のプロジェクトであっても継承関係にあればprotectedの参照は可能です。

private

privateは自分のクラスの内部からのみ参照できます。外部から参照されることがないので、自分のクラスでのみ値を参照したり、変更したい場合はprivateにすることで、他のクラスからの影響を受けることがなくなります。

記述例

プロジェクトCS18

using CS18_2;

namespace CS18
{
    class A1
    {
        public A1()
        {
            var a2 = new A2(); //A2は見れる
            var bi = new BP(); //BPは見れる BIは見れない
            var a3 = new A3();

            a3.InternalMethod();
            a3.InternalProtectedMethod();
            a3.PublicMethod(); //privateとprotectedは見れない
        }
    }

    class A11:A3//継承すればbaseキーワードで見れる
    {
        public A11()
        {
            base.InternalMethod();
            base.InternalProtectedMethod();
            base.PublicMethod();
            base.ProtectedMethod();
        }
    }
}
namespace CS18
{
    class A2
    {
    }
}

クラス名にアクセス修飾子を省略するとinternalと同等の動作となります。

namespace CS18
{
    class A3
    {
        public void PublicMethod()
        {
        }

        internal void InternalMethod()
        {
        }

        protected void ProtectedMethod()
        {
        }

        internal protected void InternalProtectedMethod()
        {
        }

        private void PrivateMethod()
        {
        }
    }
}

プロジェクトCS18_2

namespace CS18_2
{
    internal class BI
    {
    }
}
namespace CS18_2
{
    public class BP
    {
    }
}