C Sharpの基礎 - アクセス修飾子
概要
オブジェクト指向の言語を構成する要素にクラスがある。
クラスのメンバ変数やメソッドには、アクセシビリティというものが存在する。
これは、どこからアクセスできるかという制限の度合いを表し、その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メソッドにすればよい。