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

C#のクラスとは?基本概念からコンストラクタまで徹底解説

C#におけるクラスは、最も重要な型の一つです。クラスは、問題領域に関連するオブジェクトを生成するための「設計図」と考えることができます。つまり、クラスはテンプレートであり、そこからオブジェクトを作成します。クラスには、そのクラスから作られるオブジェクト群が共有する構造(データ)と振る舞い(メソッド)が定義されています。たとえるなら、クラスは「クッキーの型」であり、オブジェクトはその型で作られた「クッキー」そのものです。

カプセル化という重要な概念

クラスは、オブジェクト指向プログラミングにおける重要な概念である「カプセル化」を実現します。カプセル化とは、データと、そのデータを操作する処理を一箇所にまとめ、そのオブジェクトの利用者に対してシンプルなAPIを提供することを意味します。クラスを使うことで、データをカプセル化し、他のクラスから不必要な詳細を隠すことができます。

クラスは、classキーワードに続けてクラス名を記述することで定義できます。

// User.cs
public class User{
   private string name;
   private int salary;
   public void Promote(){
      salary += 1000;
   }
}

上記の例では、Userはユーザーを表すクラスです。このクラスは、namesalary という2つのデータをカプセル化しています。これらは「フィールド」と呼ばれ、ユーザーの名前と給与を保持します。また、Promote() というメソッドも持っており、これを呼び出すとユーザーの給与が1000増加します。

アクセス修飾子の種類

各クラスにはアクセス修飾子が関連付けられており、そのクラスが他のクラスから見えるかどうかを制御します。アクセス修飾子として指定できるのは、以下の5種類です。

アクセス修飾子説明
public無制限のアクセス
protected派生クラスに限定されたアクセス
internal同一アセンブリ内に限定されたアクセス
protected internal同一アセンブリまたは派生クラスに限定されたアクセス
private外部からのアクセス不可

new演算子によるインスタンスの生成

クラスのインスタンスを作成するには、new キーワードを使用します。new 演算子は、オブジェクトのデータに必要なバイト数を計算し、そのオブジェクト用のメモリを確保します。そして、新しく作成されたオブジェクトへのポインタ(参照とも呼ばれます)を返します。

var alice = new User();
var bob = new User();

この参照は、= 記号の左側にある変数に格納されます。上記の例では、alice と bob が、新しく作成されたオブジェクトへの参照(ポインタ)を保持していることになります。

C#のクラスとは?基本概念からコンストラクタまで徹底解説

C#では、クラスの命名規則としてPascalCase(パスカルケース)が推奨されています。これは複合語の各単語の頭文字を大文字にする表記法で、StringBuilder や UserController などがその例です。クラス名と同じ名前のファイルにクラスを定義する必要はありませんが、多くのC#プロジェクトではこの規約が慣習的に採用されています。

コンストラクタでオブジェクトを初期化する

先ほどの例でUserクラスのインスタンス(alice と bob)を作成した際には、初期の名前や給与を指定していませんでした。新しく作成されたオブジェクトは、その役割を果たすために何らかの情報を必要とすることがよくあります。そんなときに活躍するのが「コンストラクタ」です。コンストラクタは、クラスのデータを初期化するために使用される特別なメソッドです。

次のようにコンストラクタを追加すると、ユーザーの名前と給与を受け取れるようになります。

public class User{
   private string name;
   private int salary;
   public User(string name, int salary){
      this.name = name;
      this.salary = salary;
   }
   public void Promote(){
      salary += 1000;
   }
}

コンストラクタを定義しておけば、新しいインスタンスを作成するときに、ユーザーの名前と給与を引数として渡せます。

var alice = new User("Alice", 50000);
var bob = new User("Bob", 45000);

1つのクラスに複数のコンストラクタを持たせることも可能です。複数のコンストラクタを用意すれば、状況に応じてさまざまな方法でクラスを初期化できます。たとえば、名前だけを受け取り、給与にはデフォルト値を設定する別のコンストラクタを追加することもできます。

public User(string name){
   this.name = name;
   this.salary = 50000;
}

サンプルコード

ここまでの内容をまとめた完全なサンプルコードがこちらです。引数なし・名前のみ・名前と給与ありの3種類のコンストラクタを使い分けています。

using System;
class Program{
   static void Main(){
      var alice = new User();
      alice.Print();

      var bob = new User();
      bob.Print();
      var chris = new User("Chris", 50000);
      chris.Print();
      var debs = new User("Debs", 45000);
      debs.Print();

      var scott = new User("Scott");
      scott.Print();
   }
}
public class User{
   private string name;
   private int salary;
   public User(){

   }
   public User(string name){
      this.name = name;
      this.salary = 50000;
   }
   public User(string name, int salary){
      this.name = name;
      this.salary = salary;
   }
   public void Promote(){
      salary += 1000;
   }
   public void Print(){
      Console.WriteLine($"{name}: {salary}");
   }
}

実行結果

: 0
: 0
Chris: 50000
Debs: 45000
Scott: 50000

このように、引数を渡さずに生成したインスタンスはフィールドが初期値(null と 0)のままになり、名前のみを渡した場合はデフォルトの給与が設定されていることが確認できます。クラス、フィールド、メソッド、コンストラクタの関係を理解することは、C#によるオブジェクト指向プログラミングの第一歩です。

  1. C言語入門:ポインタ配列とポインタへのポインタ(二重ポインタ)の基本をわかりやすく解説

    はじめにC言語において、ポインタはメモリを直接扱える強力な機能です。本記事では、その応用形である「ポインタ配列」と「ポインタへのポインタ(二重ポインタ)」について、宣言方法・初期化方法・値へのアクセス方法を、サンプルコードと実行結果とともに順を追って解説します。 ポインタ配列とは通常の変数と同様に、ポインタも配列として宣言することができます。これを「ポインタ配列」と呼びます。各要素がそれぞれ別のアドレスを保持できるため、複数のデータを間接的に扱う際に便利です。 宣言方法データ型 *ポインタ名 [サイズ];例えば、次のように宣言します。int *p[5]; // int型の要素アドレスを5つ格納

  2. C言語のポインタ入門!宣言・初期化から配列アクセスの実例まで徹底解説

    ポインタ(pointer)とは、他の変数のメモリアドレスを格納するための変数です。C言語においてポインタは、メモリを直接操作したり、関数間でデータを効率的にやり取りしたりするために欠かせない重要な概念です。 ポインタの宣言・初期化とアクセス まず、次のような通常の整数変数の宣言を見てみましょう。 int qty = 179; 変数qtyには値「179」が格納されると同時に、メモリ上のどこかにその格納場所(アドレス)が割り当てられます。 ポインタの宣言 int *p; 「p」はポインタ変数であり、別の整数型(int)変数のアドレスを保持します。変数名の前にアスタリスク(*)を付けることで、「こ