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
インスタンスの両方がヒープ内の同じメモリ位置を指していることを意味します。参照型変数を別の変数にコピーする場合にのみ、参照型変数の参照をコピーします。
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