C Sharpの基礎 - アクセス修飾子

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

オブジェクト指向の言語を構成する要素にクラスがある。
クラスのメンバ変数やメソッドには、アクセシビリティというものが存在する。
これは、どこからアクセスできるかという制限の度合いを表し、その1つにinternal修飾子がある。

ここでは、internal修飾子について記載する。


アクセス修飾子とは

C#には様々なアクセス修飾子が存在する。
まず、どのような修飾子があるのか確認する。

以下、アセンブリという用語が出てくるが、アセンブリとは実行可能ファイル(EXE)またはライブラリ(DLL)のことを指す。
C#では、1つのプロジェクトで1つのアセンブリが作成される。

public

他のプロジェクトからでもアクセスできる修飾子である。
どこからでもアクセスできる反面、プログラムを修正する際には、どこまで影響範囲があるのかの確認が必要となる。

サードパーティ製のDLLを組み込む場合、実行段階にならないとエラー箇所が判明しない等、安易に使用するのは推奨されない。

internal

同一アセンブリ内のクラスからのみアクセス可能な修飾子である。
他のプロジェクトからはアクセス不可となる。

publicと違い修正範囲が限定されているため、同じアセンブリ内でのみ使用する場合は、こちらを使用する方がよい。

protected

クラス内部と派生クラスの内部のみアクセス可能な修飾子である。
基底クラスだけで使用する場合はprivate、派生クラスも使用する場合はprotectedを実装する。

異なるアセンブリであっても、継承関係にあればprotectedの参照は可能である。

private

クラス内部のみアクセス可能な修飾子である。
外部から参照されることがなく、他のクラスの影響を受けない分、最も制限が厳しい修飾子である。

クラスの定義は名前空間の直下やファイルの直下に記述できるが、この時に指定できるアクセス修飾子はpublicとinternalの2種類のみである。

また、メソッド等のアクセス修飾子を明示的に指定しない場合、自動的にprivateになるので注意すること。


internalの実装方法

以下の例では、internalの実装方法を記述している。

 // internalの実装方法 1
 // Sample1.cs
 using System;
 using System.Windows.Forms;
 
 namespace WindowsFormsApp
 {
    public partial class Form1 : Form
    {
       public Form1()
       {
          InitializeComponent();
       }
 
       private void button1_Click(object sender, EventArgs e)
       {
          ClassSample clsSample = new ClassSample();
 
          clsSample.GetName();
       }
    }
 }
 
 // Sample2.cs
 using System;
 
 namespace WindowsFormsApp
 {
    internal class ClassSample
    {
       internal void GetName()
       {
          Console.WriteLine("internal");
       }
    }
 }


# 出力
internal



protected internalの実装方法

以下の例では、protected internalの実装方法を記述している。

 // internalの実装方法 2
 // Sample1.cs
 using System;
 using System.Windows.Forms;
 
 namespace WindowsFormsApp
 {
    public partial class Form1 : Form
    {
       public Form1()
       {
          InitializeComponent();
       }
 
       private void button1_Click(object sender, EventArgs e)
       {
          ClassSample clsSample = new ClassSample();
 
          clsSample.GetName();
       }
    }
 }
 
 // Sample2.cs
 using System;
 
 namespace WindowsFormsApp
 {
    internal class ClassSample
    {
       internal protected void GetName()
       {
          Console.WriteLine("internal protected");
       }
    }
 }


# 出力
internal protected



その他

internalクラス内のメソッドにおいて、publicメソッドまたはinternalメソッドのいずれかを選択する時、publicメソッドで宣言した方がよい。

主な理由として、異なるアセンブリに公開する場合、クラスをpublicに変更すればメソッドが公開されるからである。
もし、internalメソッドならば、全てのinternalメソッドをpublicメソッドに変更しなければならない。

絶対に外部に公開しないメソッドのみ、internalメソッドにすればよい。