C# での構造体とクラスの違い

Muhammad Maisam Abbas 2024年2月16日
  1. C# の構造
  2. C# のクラス
  3. C# の構造体とクラスの違い
C# での構造体とクラスの違い

このチュートリアルでは、C# の構造体とクラスの違いと類似点について説明します。

C# の構造

struct キーワードは、C# で構造体を定義します。クラスと同様に、構造体には変数、プロパティ、および関数を含めることができます。C# で構造体のコンストラクターを定義できます。ただし、C# の構造体のデフォルトコンストラクターを定義することはできません。C# では構造体のデストラクタを定義できません。構造体は、C# でインターフェイスを実装することもできます。構造体とクラスの主な違いは、継承のために他の構造体またはクラスのベースとして構造体を使用できないことです。次のコード例は、C# で struct キーワードを使用して単純な構造体を定義する方法を示しています。

struct MyStructure {
  public int x;
};

上記のコードでは、C# で struct キーワードを使用して構造体を定義しています。構造は、インスタンスを作成することで使用できます。構造体のインスタンスを作成するためのコードを以下に示します。

MyStructure S = new MyStructure();

上記のコードでは、C# で new キーワードを使用して構造 MyStructure のインスタンスを作成しました。

C# のクラス

class キーワードは、C# でクラスを定義します。構造体と同様に、C# でクラスは変数、プロパティ、および関数を持つことができます。C# のクラスのデフォルトコンストラクタとデストラクタを定義することもできます。クラスの重要な機能は継承です。したがって、クラスは、継承のための他のクラスのベースとして使用できます。クラスのもう 1つのユニークな機能は、ポリモーフィズムです。次のコード例は、C# で class キーワードを使用して単純なクラスを定義する方法を示しています。

class MyClass {
  int x;
  public MyClass(int a) {
    this.x = a;
  }
  public void setx(int a) {
    this.x = a;
  }
  public void show() {
    Console.WriteLine("The value of x = {0}", x);
  }
}

上記のコードでは、C# で class キーワードを使用してクラスを定義しています。クラスは、インスタンスを作成することで使用できます。クラスのインスタンスを作成するためのコードを以下に示します。

MyClass C = new MyClass(100);

上記のコードでは、C# で new キーワードを使用してクラス MyClass のインスタンスを作成しました。

C# の構造体とクラスの違い

構造体は値型変数であり、スタックに存在します。クラスは参照型変数であり、スタック内のヒープを参照してヒープ内に存在します。

構造体は null 値を持つことはできませんが、クラスは null 値を持つことができます。これは、値型変数には値が必要であるのに対し、参照型変数はメモリアドレスを指す場合とそうでない場合があることを意味します。C# の構造体とクラスの違いは、以下のコーディング例に示されています。

MyStructure S = new MyStructure();
MyStructure S2 = S;

S.x = 100;
S2.x = 200;

Console.WriteLine("Structure 1 = {0}", S.x);
Console.WriteLine("Structure 2 = {0}", S2.x);

出力:

Structure 1 = 100
Structure 2 = 200

最初に構造 MyStructure のインスタンス S を作成し、次に同じインスタンスの別のコピーS2 を作成しました。その後、両方のインスタンス内の値を初期化しました。

出力では、インスタンスの 2つの異なるコピーに対して 2つの異なる値を取得します。これは、スタック内に MyStructure 構造の 2つの別々のコピーがあることを意味します。値型変数を別の変数にコピーすると、値型変数のすべての内容の個別のコピーが作成されます。

次のコード例では、MyClass クラスで同じことを行います。

MyClass C = new MyClass(100);
MyClass newC = C;

newC.setx(100);
newC.setx(200);

C.show();
newC.show();

出力:

The value of x = 200
The value of x = 200

最初にクラス MyClass のインスタンス C を作成し、次にそのインスタンスを MyClass クラスの別のインスタンス newC にコピーしました。その後、setx() 関数を使用して、両方のインスタンス内で変数 x の値を設定します。

出力では、両方のインスタンス内で変数 x の同じ値を取得します。これは、C インスタンスと newC インスタンスの両方がヒープ内の同じメモリ位置を指していることを意味します。参照型変数を別の変数にコピーする場合にのみ、参照型変数の参照をコピーします。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

関連記事 - Csharp Class