C# クラス(Class)

クラスを定義するとき、データ型の設計図を定義します。これは実際にはデータを定義するものではなく、クラスの名前が何を意味するか、すなわちクラスのオブジェクトが何で構成され、そのオブジェクトに対してどのような操作を実行できるかを定義します。オブジェクトはクラスのインスタンスです。クラスを構成するメソッドと変数はクラスのメンバーと呼ばれます。

クラスの定義

クラスの定義はキーワードclassから始まり、その後にクラス名が続きます。クラスの本体は一対の中括弧 { } で囲まれます。以下はクラス定義の一般的な形式です。

<access specifier> class  class_name
{
    // member variables
    <access specifier> <data type> variable1;
    <access specifier> <data type> variable2;
    ...
    <access specifier> <data type> variableN;
    // member methods
    <access specifier> <return type> method1(parameter_list)
    {
        // method body
    }
    <access specifier> <return type> method2(parameter_list)
    {
        // method body
    }
    ...
    <access specifier> <return type> methodN(parameter_list)
    {
        // method body
    }
}

注意:

  • アクセス識別子 <access specifier> は、クラスとそのメンバーへのアクセス規則を指定します。指定されていない場合は、デフォルトのアクセス識別子が使用されます。クラスのデフォルトのアクセス識別子はinternal、メンバーのデフォルトのアクセス識別子はprivate。
  • データ型 <data type> は変数の型を指定し、戻り値の型 <return type> はメソッドが返すデータ型を指定します。
  • クラスのメンバーにアクセスするには、ドット(.)演算子を使用します。
  • ドット演算子はオブジェクト名とメンバー名を連結します。

次の例は、これまでに説明した概念を示しています。

例

using System;
namespace BoxApplication
{
    class Box
    {
       public double length;   // 長さ
       public double breadth;  // 幅
       public double height;   // 高さ
    }
    class Boxtester
    {
        static void Main(string[] args)
        {
            Box Box1 = new Box();        // Box1 を宣言、型は Box
            Box Box2 = new Box();        // Box2 を宣言、型は Box
            double volume = 0.0;         // 体積

            // Box1 の詳細
            Box1.height = 5.0;
            Box1.length = 6.0;
            Box1.breadth = 7.0;

            // Box2 の詳細
            Box2.height = 10.0;
            Box2.length = 12.0;
            Box2.breadth = 13.0;
           
            // Box1 の体積
            volume = Box1.height * Box1.length * Box1.breadth;
            Console.WriteLine("Box1 の体積: {0}",  volume);

            // Box2 の体積
            volume = Box2.height * Box2.length * Box2.breadth;
            Console.WriteLine("Box2 の体積: {0}", volume);
            Console.ReadKey();
        }
    }
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

Box1 的体积: 210
Box2 的体积: 1560

メンバー関数とカプセル化

クラスのメンバー関数は、他の変数と同様に、クラス定義内に定義またはプロトタイプを持つ関数です。クラスのメンバーとして、クラスの任意のオブジェクトに対して操作でき、そのオブジェクトのクラスのすべてのメンバーにアクセスできます。

メンバー変数はオブジェクトの属性であり(設計上の観点から)、カプセル化を実装するためにプライベートに保たれます。これらの変数は、パブリックメンバー関数を使用してのみアクセスできます。

上記の概念を使用して、クラス内のさまざまなクラスメンバーの値を設定および取得してみましょう。

例

using System;
namespace BoxApplication
{
    class Box
    {
       private double length;   // 長さ
       private double breadth;  // 幅
       private double height;   // 高さ
       public void setLength( double len )
       {
            length = len;
       }

       public void setBreadth( double bre )
       {
            breadth = bre;
       }

       public void setHeight( double hei )
       {
            height = hei;
       }
       public double getVolume()
       {
           return length * breadth * height;
       }
    }
    class Boxtester
    {
        static void Main(string[] args)
        {
            Box Box1 = new Box();        // Box1 を宣言、型は Box
            Box Box2 = new Box();        // Box2 を宣言、型は Box
            double volume;               // 体積


            // Box1 の詳細
            Box1.setLength(6.0);
            Box1.setBreadth(7.0);
            Box1.setHeight(5.0);

            // Box2 の詳細
            Box2.setLength(12.0);
            Box2.setBreadth(13.0);
            Box2.setHeight(10.0);
       
            // Box1 の体積
            volume = Box1.getVolume();
            Console.WriteLine("Box1 の体積: {0}" ,volume);

            // Box2 の体積
            volume = Box2.getVolume();
            Console.WriteLine("Box2 の体積: {0}", volume);
           
            Console.ReadKey();
        }
    }
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

Box1 的体积: 210
Box2 的体积: 1560

C# のコンストラクタ

クラスのコンストラクタは、クラスの新しいオブジェクトが作成されるときに実行される、クラスの特別なメンバー関数です。

コンストラクタの名前はクラス名と完全に同じで、戻り値の型はありません。

次の例はコンストラクタの概念を示しています。

例

using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // 線の長さ
      public Line()
      {
         Console.WriteLine("オブジェクトが作成されました");
      }

      public void setLength( double len )
      {
         length = len;
      }
      public double getLength()
      {
         return length;
      }

      static void Main(string[] args)
      {
         Line line = new Line();    
         // 線の長さを設定
         line.setLength(6.0);
         Console.WriteLine("線の長さ: {0}", line.getLength());
         Console.ReadKey();
      }
   }
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

对象已创建
线条的长度: 6

デフォルトのコンストラクタはパラメータを持ちません。ただし、パラメータ付きのコンストラクタが必要な場合はパラメータを持つことができます。このようなコンストラクタはパラメータ付きコンストラクタ。この手法を使用すると、オブジェクトの作成と同時に初期値を設定できます。次の例を参照してください。

例


using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // 線の長さ
      public Line(double len)  // パラメータ付きコンストラクタ
      {
         Console.WriteLine("オブジェクトが作成されました、length = {0}", len);
         length = len;
      }

      public void setLength( double len )
      {
         length = len;
      }
      public double getLength()
      {
         return length;
      }

      static void Main(string[] args)
      {
         Line line = new Line(10.0);
         Console.WriteLine("線の長さ: {0}", line.getLength());
         // 線の長さを設定
         line.setLength(6.0);
         Console.WriteLine("線の長さ: {0}", line.getLength());
         Console.ReadKey();
      }
   }
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

对象已创建,length = 10
线条的长度: 10
线条的长度: 6

C# のデストラクタ

クラスのデストラクタは、クラスのオブジェクトがスコープ外になるときに実行される、クラスの特別なメンバー関数です。

デストラクタの名前は、クラス名の前にチルダ(~)を接頭辞として付けます。戻り値はなく、パラメータもありません。

デストラクタは、プログラムを終了する前(ファイルのクローズ、メモリの解放など)にリソースを解放するために使用されます。デストラクタは継承もオーバーロードもできません。

次の例はデストラクタの概念を示しています。

例


using System;
namespace LineApplication
{
   class Line
   {
      private double length;   // 線の長さ
      public Line()  // コンストラクタ
      {
         Console.WriteLine("オブジェクトが作成されました");
      }
      ~Line() // デストラクタ
      {
         Console.WriteLine("オブジェクトが削除されました");
      }

      public void setLength( double len )
      {
         length = len;
      }
      public double getLength()
      {
         return length;
      }

      static void Main(string[] args)
      {
         Line line = new Line();
         // 線の長さを設定
         line.setLength(6.0);
         Console.WriteLine("線の長さ: {0}", line.getLength());          
      }
   }
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

对象已创建
线条的长度: 6
对象已删除

C# クラスの静的メンバー

私たちは使用できますstaticキーワードを使ってクラスメンバーを静的として定義します。クラスメンバーを静的として宣言すると、作成されるクラスのオブジェクトの数に関係なく、その静的メンバーのコピーは1つだけになります。

キーワードstaticクラス内にそのメンバーのインスタンスが1つだけあることを意味します。静的変数は定数を定義するために使用されます。その値はクラスのインスタンスを作成せずにクラスを直接呼び出すことで取得できるからです。静的変数は、メンバー関数やクラス定義の外部で初期化できます。クラス定義の内部で静的変数を初期化することもできます。

次の例は示しています静的変数の使い方を

例

using System;
namespace StaticVarApplication
{
    class StaticVar
    {
       public static int num;
        public void count()
        {
            num++;
        }
        public int getNum()
        {
            return num;
        }
    }
    class StaticTester
    {
        static void Main(string[] args)
        {
            StaticVar s1 = new StaticVar();
            StaticVar s2 = new StaticVar();
            s1.count();
            s1.count();
            s1.count();
            s2.count();
            s2.count();
            s2.count();        
            Console.WriteLine("s1 の変数 num: {0}", s1.getNum());
            Console.WriteLine("s2 の変数 num: {0}", s2.getNum());
            Console.ReadKey();
        }
    }
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

s1 的变量 num: 6
s2 的变量 num: 6

あなたはまた、メンバー関数として宣言できますstatic。このような関数は静的変数にのみアクセスできます。静的関数はオブジェクトの作成前にすでに存在します。次の例は静的関数の使い方を示しています。

例

using System;
namespace StaticVarApplication
{
    class StaticVar
    {
       public static int num;
        public void count()
        {
            num++;
        }
        public static int getNum()
        {
            return num;
        }
    }
    class StaticTester
    {
        static void Main(string[] args)
        {
            StaticVar s = new StaticVar();
            s.count();
            s.count();
            s.count();                  
            Console.WriteLine("変数 num: {0}", StaticVar.getNum());
            Console.ReadKey();
        }
    }
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

变量 num: 3
その他の拡張