1. 構造を定義する
構造体を定義するには、struct キーワードを使用する必要があります。各構造体は、以下で宣言されている Books 構造体など、複数のメンバー (メンバー属性とメンバー メソッド) を含むことができる新しいタイプのデータとみなすことができます。
struct Books {
public string title;
public string author;
public string subject;
public int book_id;
};
構造を設計する際には、次の点に留意する必要があります。
- 各構造体にはデフォルトで作成された暗黙的なパラメータなしのコンストラクタがあるため、構造体に対してパラメータなしのコンストラクタを宣言することはできません。
- 静的プロパティと定数を除き、メンバー プロパティは宣言時に初期化できません。
- 構造体のコンストラクターは、構造体のすべてのメンバー プロパティを初期化する必要があります。
- 構造体は他のクラスや構造体から継承したり、クラスの基本型として使用したりすることはできませんが、構造体型はインターフェイスを実装できます。
- デストラクターは構造体内で宣言できません。
この構造体の使用方法を示す例を次に示します。
using System;
namespace it-kiso.com
{
struct Books {
public string title;
public string author;
public string subject;
public int book_id;
}
class Demo
{
static void Main(string[] args)
{
Books book1; // Books型のbook1を宣言
Books book2; // Books型のbook2を宣言
// book1の属性を定義する
book1.title = "C#チュートリアル";
book1.author = "IT基礎";
book1.subject = "C#プログラミングチュートリアル";
book1.book_id = 123456;
// book2の属性を定義する
book2.title = "HTTPチュートリアル";
book2.author = "IT基礎";
book2.subject = "HTTPプロトコルチュートリアル";
book2.book_id = 123455;
// book1の属性情報を出力する
Console.WriteLine("book1 title : {0}", book1.title);
Console.WriteLine("book1 author : {0}", book1.author);
Console.WriteLine("book1 subject : {0}", book1.subject);
Console.WriteLine("book1 book_id :{0}", book1.book_id);
// book2の属性情報を出力する
Console.WriteLine("book2 title : {0}", book2.title);
Console.WriteLine("book2 author : {0}", book2.author);
Console.WriteLine("book2 subject : {0}", book2.subject);
Console.WriteLine("book2 book_id :{0}", book2.book_id);
Console.ReadKey();
}
}
}
操作の結果は次のようになります。
book1 title : C#チュートリアル
book1 author : IT基礎
book1 subject : C#プログラミングチュートリアル
book1 book_id :123456
book2 title : HTTPチュートリアル
book2 author : IT基礎
book2 subject : HTTPプロトコルチュートリアル
book2 book_id :123455
2. 構造の特徴
C# の構造は C/C++ の構造とは大きく異なり、C# の構造には次の機能があります。
- 構造体には、メソッド、フィールド、インデックス、プロパティ、演算子メソッド、およびイベントを含めることができます。
- コンストラクターは構造体で定義できますが、デストラクターは定義できません。パラメーターのないコンストラクターはデフォルトで C# によって自動的に定義され、変更できないため、定義されたコンストラクターにパラメーターを含めることはできないことに注意してください。
- クラスとは異なり、構造体は他の構造体またはクラスから継承できません。
- 構造体を他の構造体またはクラスの基本構造体として使用することはできません。
- 構造体は 1 つ以上のインターフェイスを実装できます。
- 構造体のメンバーを抽象、仮想、または保護に設定することはできません。
- クラスとは異なり、構造体は New 演算子を使用せずにインスタンス化できます。New 演算子を使用して構造体をインスタンス化すると、構造体のコンストラクターが自動的に呼び出されます。
- New 演算子を使用せずに構造体をインスタンス化すると、構造体オブジェクト内のフィールドは未割り当てのままになり、すべてのフィールドが初期化されるまで構造体インスタンスは使用できません。
クラスと構造体の主な違いは次のとおりです。
- クラスは参照型であり、構造体は値型です。
- 構造体は継承をサポートしていませんが、インターフェイスは実装できます。
- デフォルトのコンストラクターを構造体内で宣言することはできません。
上記の特性に基づいて、前の例を完成させましょう。
using System;
namespace it-kiso.com
{
struct Books {
public string title;
public string author;
public string subject;
public int book_id;
public void getValue(string t, string a, string s, int id){
title = t;
author = a;
subject = s;
book_id = id;
}
public void disPlay(){
Console.WriteLine("タイトル:{0}", title);
Console.WriteLine("著者:{0}", author);
Console.WriteLine("主題:{0}", subject);
Console.WriteLine("書籍ID:{0}", book_id);
}
}
class Demo
{
static void Main(string[] args)
{
Books book1 = new Books(); // Books構造体のインスタンス化
Books book2 = new Books(); // Books構造体のインスタンス化
// book1の属性を定義
book1.getValue("C#チュートリアル","IT基礎","C#プログラミングチュートリアル",123456);
// book2の属性を定義
book2.getValue("HTTPチュートリアル","IT基礎","HTTPプロトコルチュートリアル",123455);
// book1の属性情報を出力
book1.disPlay();
// book2の属性情報を出力
book2.disPlay();
Console.ReadKey();
}
}
}