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

提供:MochiuWiki : SUSE, EC, PCB
2021年11月15日 (月) 00:33時点におけるWiki (トーク | 投稿記録)による版 (文字列「</source>」を「</syntaxhighlight>」に置換)
ナビゲーションに移動 検索に移動

概要

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

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


アクセス修飾子とは

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

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

public

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

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

internal

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

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

protected

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

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

private

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

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

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


internalの実装方法

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

<source lang="csharp">
// 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");
      }
   }
}
</syntaxhighlight>


# 出力
internal



protected internalの実装方法

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

<source lang="csharp">
// 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");
      }
   }
}
</syntaxhighlight>


# 出力
internal protected



その他

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

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

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