C#のinternal修飾子とprivate修飾子の違いを徹底解説!アクセス範囲の違いと使い分け
C#には、クラスのメンバー(変数やメソッド)へのアクセス範囲を制御するための「アクセス修飾子」がいくつか用意されています。その中でもよく使われるのが internal(内部) と private(プライベート) です。この2つはどちらも外部からのアクセスを制限する役割を持ちますが、アクセスを許可する範囲が大きく異なります。
本記事では、それぞれの特徴とコード例を通じて、両者の違いをわかりやすく解説します。
internal修飾子(内部アクセス指定子)とは
internal修飾子を付けたメンバーは、同じアセンブリ(プロジェクト)内であれば自由にアクセスできる ようになります。つまり、同一アプリケーション内に定義された任意のクラスやメソッドから、そのメンバーにアクセス可能です。
アセンブリの外(別のDLLや参照先プロジェクト)からはアクセスできないため、「ライブラリ内部でのみ共有したい機能」に適した修飾子です。
internalの使用例
using System;
namespace RectangleApplication {
class Rectangle {
// メンバー変数
internal double length;
internal double width;
double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}// Rectangleクラス終了
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
// 同じアセンブリ内なので直接アクセスできる
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}上記の例では、length と width を internal として宣言しています。ExecuteRectangle クラスは同じアセンブリ内にあるため、Rectangle オブジェクトのこれらのフィールドに直接値を代入できます。
private修飾子(プライベートアクセス指定子)とは
private修飾子は、最も厳格なアクセス制限を行う修飾子です。同じクラス内からのみアクセスでき、他のクラスやオブジェクトからは一切アクセスできません。
外部からの不正な操作を防ぎ、データを保護したい場合に使用します。privateなフィールドの値を読み書きするには、publicなメソッドやプロパティを経由するのが一般的です。
privateの使用例
using System;
namespace RectangleApplication {
class Rectangle {
private double length;
private double width;
// privateメンバーへは同じクラス内のメソッドからのみアクセス可能
public void Acceptdetails() {
length = 10;
width = 15;
}
public double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
// r.length = 4.5; ← これはコンパイルエラーになる
r.Acceptdetails();
r.Display();
Console.ReadLine();
}
}
}この例では、length と width が private であるため、Main メソッドから r.length = 4.5; のように直接代入しようとするとコンパイルエラーになります。代わりに、publicメソッド Acceptdetails() を呼び出して値を設定しています。
internalとprivateの違いまとめ
両者の違いを表に整理すると以下のようになります。
| 項目 | internal | private |
|---|---|---|
| アクセス範囲 | 同じアセンブリ内のすべてのコード | 同じクラス内のみ |
| 制限の強さ | 中程度 | 最も厳格 |
| 主な用途 | アセンブリ内部で共有するAPIやヘルパー | クラス内部の状態や実装詳細の隠蔽 |
| デフォルト(classのメンバー) | ― | ○(修飾子省略時はprivateになる) |
使い分けのポイント
- private:そのクラスだけで完結すべきデータや処理。カプセル化の基本。
- internal:同一プロジェクト内の複数クラス間で共有したいが、ライブラリ利用者には公開したくない機能。
なお、C#ではクラスのメンバーに対してアクセス修飾子を省略した場合、既定で private になります。意図せずアクセスできないトラブルを避けるためにも、明示的に修飾子を記述する習慣をつけるとよいでしょう。
-
C#におけるリテラルと定数の違いとは?種類と書き方をわかりやすく解説
定数とリテラルとは何か 定数(constant)とは、プログラムの実行中に値を変更できない固定値のことです。そして、その固定値をソースコード上に直接記述したものを「リテラル」と呼びます。定数は整数、浮動小数点数、文字、文字列といった基本データ型のいずれにもなり得ます。さらに、enum(列挙型)による列挙定数も存在します。 整数リテラル 整数リテラルは、10進数または16進数で表現できます。基数を指定するにはプレフィックス(接頭辞)を使用します。16進数の場合は「0x」または「0X」を付け、10進数の場合はプレフィックスを付けません。 150 300u 上記の例では「150」が10進数の整数リ
-
C#におけるstringとStringの違いは何ですか?
C#のstringとStringの違いC#プログラミングにおいて、stringとStringはどちらも同じ型を指しますが、その扱いには微妙な違いがあります。Stringは.NET FrameworkのクラスであるSystem.Stringを直接表すものであり、一方、stringはC#言語が用意しているSystem.Stringのエイリアス(別名)です。つまり、両者はコンパイル後にまったく同じものとして扱われます。基本的な使い方の例string str = Welcome!;このように文字列変数を宣言する際は、通常小文字のstringを使用します。使い分けの目安厳密なルールはありませんが、一般的