C#のアクセス指定子とは?目的と5つの種類をわかりやすく解説
アクセス指定子(アクセス修飾子)とは、クラスのメンバー(フィールドやメソッドなど)に対して、どこからアクセスできるのかという範囲(スコープ)と可視性を定義するためのキーワードです。適切なアクセス指定子を使い分けることで、カプセル化を実現し、安全で保守性の高いコードを書くことができます。
C#では、主に以下の5種類のアクセス指定子がサポートされています。
- public(パブリック)
- private(プライベート)
- protected(プロテクテッド)
- internal(インターナル)
- protected internal(プロテクテッド・インターナル)
それでは、それぞれの特徴を順番に見ていきましょう。
public:すべてのコードからアクセス可能
publicアクセス指定子を付けたメンバーは、同じアセンブリ内だけでなく、参照している外部アセンブリからも自由にアクセスできます。クラスのメンバー変数やメソッドを、他の関数やオブジェクトに公開したい場合に使用します。
private:同じクラス内からのみアクセス可能
privateアクセス指定子を付けると、そのメンバーは同じクラス内からしかアクセスできません。クラスの内部実装を隠蔽し、外部からの不正な操作や意図しない変更を防ぐために使われます。実際の開発では、フィールドをprivateにして、publicなプロパティやメソッド経由でのみアクセスを許可する設計が一般的です。
protected:派生クラスからアクセス可能
protectedアクセス指定子を付けたメンバーは、そのクラス自身と、そのクラスを継承した派生クラス(子クラス)からアクセスできます。基底クラスの機能を子クラスで利用したり拡張したりしたい場合に便利です。
internal:同じアセンブリ内からアクセス可能
internalアクセス指定子を付けると、同じアセンブリ(同一プロジェクト)内のコードからはアクセスできますが、別のアセンブリからはアクセスできません。ライブラリ開発などで、外部には公開せずプロジェクト内だけで共有したい処理をまとめる際によく使われます。
protected internal:同じアセンブリ内+派生クラスからアクセス可能
protected internalは、protectedとinternalを組み合わせた指定子です。同じアセンブリ内のすべてのコード、および別アセンブリであってもそのクラスを継承した派生クラスからアクセスできます。それ以外のクラスやオブジェクトからは隠蔽されます。
アクセスレベルの比較一覧
| アクセス指定子 | 同じクラス | 派生クラス | 同じアセンブリ | 外部アセンブリ |
|---|---|---|---|---|
| public | ○ | ○ | ○ | ○ |
| private | ○ | × | × | × |
| protected | ○ | ○ | △(継承時のみ) | △(継承時のみ) |
| internal | ○ | ○ | ○ | × |
| protected internal | ○ | ○ | ○ | △(継承時のみ) |
コード例
class SampleClass
{
public int publicValue = 1; // どこからでもアクセス可能
private int privateValue = 2; // このクラス内のみ
protected int protectedValue = 3; // このクラスと派生クラス
internal int internalValue = 4; // 同じアセンブリ内
protected internal int piValue = 5; // 同じアセンブリ内+派生クラス
}
このように、アクセス指定子を使い分けることで「外部に公開するもの」と「内部に隠すもの」を明確に分離でき、バグの発生を抑えながら柔軟なクラス設計を行うことができます。
-
C#のクラスにおけるメンバー変数とは?意味と使い方を徹底解説
C#におけるクラスとメンバー変数の基本C#において、クラスはメンバー変数(フィールド)とメソッド(関数)を含む「設計図」であり、そこから生成されるオブジェクトの状態や振る舞いを定義するものです。まずはクラスの基本構文を確認し、メンバー変数がどのように宣言されるのかを見ていきましょう。クラスの基本構文<アクセス修飾子> class クラス名 { // メンバー変数 <アクセス修飾子> <データ型> 変数1; <アクセス
-
JavaのProcessクラスとは?目的と主なメソッドを実例付きで解説
概要java.lang.Processクラスは、Objectクラスのサブクラスであり、Runtimeクラスのexec()メソッドによって起動された外部プロセスを表現するためのクラスです。Processオブジェクトを通じて、起動したプロセスの制御や情報の取得を行うことができます。なお、Processクラスは抽象クラスとして定義されているため、直接インスタンス化することはできません。インスタンスは、Runtime.exec()などのメソッドの戻り値として取得します。主なメソッドdestroy(): プロセスを強制終了させるexitValue(): プロセスの終了コードを返すgetErrorStre