C#はオブジェクト指向プログラミング(OOP)を基盤とした言語であり、クラスやオブジェクトの概念をしっかり理解することが重要です。この章では、クラスとオブジェクトの定義から、コンストラクタ、デストラクタ、フィールド、プロパティ、アクセス修飾子、静的メンバーの使い方までを詳しく解説します。
6.1 クラスの定義とインスタンス化
クラスは、オブジェクトの設計図のようなもので、オブジェクトの属性(データ)と動作(メソッド)をまとめたものです。クラスから生成された実体をオブジェクトまたはインスタンスと呼びます。
クラスの基本構文
public class Person
{
public string Name; // フィールド
public int Age; // フィールド
public void Greet() // メソッド
{
Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old.");
}
}
インスタンス化
Person person = new Person();
person.Name = "John";
person.Age = 30;
person.Greet(); // 出力: Hello, my name is John and I am 30 years old.
解説
– クラスPerson
には2つのフィールドName
とAge
、そして1つのメソッドGreet
があります。
– クラスからオブジェクトを生成し、生成したオブジェクトにアクセスするためにドット(.
)演算子を使用します。ここでは、person.Name
とperson.Age
でフィールドに値を設定し、person.Greet()
でメソッドを呼び出しています。
6.2 コンストラクタとデストラクタの役割
コンストラクタは、オブジェクトの初期化時に実行される特殊なメソッドです。クラスと同じ名前を持ち、戻り値を持たないためvoid
も記述しません。オブジェクトが生成されるときに自動的に呼び出されます。
コンストラクタの定義
public class Person
{
public string Name;
public int Age;
// コンストラクタ
public Person(string name, int age)
{
Name = name;
Age = age;
}
public void Greet()
{
Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old.");
}
}
コンストラクタを使ったインスタンス化
Person person = new Person("Alice", 25);
person.Greet(); // 出力: Hello, my name is Alice and I am 25 years old.
解説
– コンストラクタPerson(string name, int age)
は、オブジェクトの生成時に名前と年齢を設定します。
– new Person("Alice", 25)
でインスタンス化するとき、name
には”Alice”、age
には25が渡され、フィールドに初期値が設定されます。
デストラクタは、オブジェクトが破棄されるときに実行されるメソッドです。デストラクタはクラス名の前にチルダ(~
)を付けて定義し、引数を取ることができません。
デストラクタの定義
public class Person
{
public string Name;
public int Age;
// コンストラクタ
public Person(string name, int age)
{
Name = name;
Age = age;
}
// デストラクタ
~Person()
{
Console.WriteLine("Person object is being destroyed.");
}
}
解説
– デストラクタ~Person()
はオブジェクトがガベージコレクタによって破棄されるときに呼び出されます。
– デストラクタは主にリソースのクリーンアップに使われますが、通常はC#のガベージコレクションに任せておくのが一般的です。
6.3 フィールド、プロパティ、メソッドのアクセス修飾子
クラスのメンバー(フィールド、プロパティ、メソッド)には、アクセスレベルを制御するためのアクセス修飾子があります。
- public: どこからでもアクセスできます。
- private: 同じクラス内からのみアクセスできます。
- protected: 同じクラスまたは派生クラスからアクセスできます。
- internal: 同じアセンブリ内からのみアクセスできます。
プロパティの定義
public class Person
{
private string name; // プライベートフィールド
public string Name // パブリックプロパティ
{
get { return name; }
set
{
if (!string.IsNullOrEmpty(value))
{
name = value;
}
}
}
}
解説
– name
フィールドはprivate
として定義されています。このため、クラスの外部から直接アクセスできません。
– プロパティName
は、get
アクセサとset
アクセサを持ち、name
フィールドにアクセスするためのインターフェースを提供します。
– set
アクセサでは、値がnull
や空文字でない場合にのみname
フィールドに値を設定します。
6.4 静的メンバー (static
) の使い方
静的メンバーは、クラスに関連付けられており、クラスのインスタンスを生成しなくてもアクセスできます。静的メンバーは、全てのインスタンス間で共有されます。
静的フィールドとメソッドの例
public class MathUtility
{
public static double Pi = 3.14159; // 静的フィールド
public static double Multiply(double a, double b) // 静的メソッド
{
return a * b;
}
}
使用例
double result = MathUtility.Multiply(2, 3); // インスタンスを生成せずにメソッドを呼び出す
Console.WriteLine(result); // 出力: 6
Console.WriteLine(MathUtility.Pi); // 出力: 3.14159
解説
– MathUtility
クラスのPi
フィールドとMultiply
メソッドはstatic
で定義されているため、クラス名を使って直接アクセスできます。
– 静的メンバーは、全てのインスタンスで共有され、クラス全体で1つだけ存在します。
6.5 オブジェクト初期化子と匿名型
オブジェクト初期化子を使うと、インスタンス生成時にフィールドやプロパティに値を設定できます。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// 使用例
Person person = new Person { Name = "Bob", Age = 40 };
Console.WriteLine($"{person.Name}, {person.Age}"); // 出力: Bob, 40
解説
– オブジェクト初期化子を使うことで、インスタンス生成時にフィールドやプロパティに値を設定できます。
– この例では、new Person { Name = "Bob", Age = 40 }
によってName
とAge
が設定されます。
匿名型を使うと、クラスを定義せずにプロパティを持つオブジェクトを作成できます。
var person = new { Name = "Charlie", Age = 35 };
Console.WriteLine($"{person.Name}, {person.Age}"); // 出力: Charlie, 35
解説
– new { Name = "Charlie", Age = 35 }
によって匿名型のオブジェクトが作成されます。
– このオブジェクトはvar
キーワードを使って変数に格納され、プロパティにアクセスできます。
まとめ
この章では、C#のクラスとオブジェクト指向の基本について学びました。クラスとオブジェクトの関係や、コンストラクタとデストラクタの使い方、フィールドとプロパティのアクセス修飾子、静的メンバー、オブジェクト初期化子、匿名型について理解できたと思います。これらの知識を使うことで、オブジェクト指向プログラミングの基本をしっかりと押さえ、効率的でメンテナンス性の高いコードを書くことができます。
コメント