C#
 Computer >> コンピューター >  >> プログラミング >> C#

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の違いまとめ

両者の違いを表に整理すると以下のようになります。

項目internalprivate
アクセス範囲同じアセンブリ内のすべてのコード同じクラス内のみ
制限の強さ中程度最も厳格
主な用途アセンブリ内部で共有するAPIやヘルパークラス内部の状態や実装詳細の隠蔽
デフォルト(classのメンバー)○(修飾子省略時はprivateになる)

使い分けのポイント

  • private:そのクラスだけで完結すべきデータや処理。カプセル化の基本。
  • internal:同一プロジェクト内の複数クラス間で共有したいが、ライブラリ利用者には公開したくない機能。

なお、C#ではクラスのメンバーに対してアクセス修飾子を省略した場合、既定で private になります。意図せずアクセスできないトラブルを避けるためにも、明示的に修飾子を記述する習慣をつけるとよいでしょう。

  1. C#におけるリテラルと定数の違いとは?種類と書き方をわかりやすく解説

    定数とリテラルとは何か 定数(constant)とは、プログラムの実行中に値を変更できない固定値のことです。そして、その固定値をソースコード上に直接記述したものを「リテラル」と呼びます。定数は整数、浮動小数点数、文字、文字列といった基本データ型のいずれにもなり得ます。さらに、enum(列挙型)による列挙定数も存在します。 整数リテラル 整数リテラルは、10進数または16進数で表現できます。基数を指定するにはプレフィックス(接頭辞)を使用します。16進数の場合は「0x」または「0X」を付け、10進数の場合はプレフィックスを付けません。 150 300u 上記の例では「150」が10進数の整数リ

  2. C#におけるstringとStringの違いは何ですか?

    C#のstringとStringの違いC#プログラミングにおいて、stringとStringはどちらも同じ型を指しますが、その扱いには微妙な違いがあります。Stringは.NET FrameworkのクラスであるSystem.Stringを直接表すものであり、一方、stringはC#言語が用意しているSystem.Stringのエイリアス(別名)です。つまり、両者はコンパイル後にまったく同じものとして扱われます。基本的な使い方の例string str = Welcome!;このように文字列変数を宣言する際は、通常小文字のstringを使用します。使い分けの目安厳密なルールはありませんが、一般的