パーシャルクラス
C# 2.0以上では、クラス定義時にpartialというキーワードを付けることで、クラス定義を複数に分割できる。それぞれのクラス定義は別ファイルにあってもよいが、全ての分割された定義にpartialキーワードを付けなければならない。
using System; namespace Sample { partial class Complex { public double re; public double im; } partial class Complex { public double Abs() { return Math.Sqrt(re * re + im * im); } } class Program { static void Main(string[] args) { Complex c = new Complex(); c.re = 3; c.im = 4; Console.WriteLine("{0}", c.Abs()); // 5 } } }
パーシャルメソッド
C# 3.0以上では、パーシャルクラス内でメソッドの宣言時にpartialキーワードを付けることで、メソッドの宣言と定義を分けることができる(パーシャルメソッド)。制限は以下のとおり。
- privateであること
- 戻り値はvoidであること
using System; namespace Sample { partial class Program { static void Main(string[] args) { OnBegin(); OnEnd(); } static private void OnBegin(); static private void OnEnd(); } }
パーシャルメソッドは、宣言のみで実装が与えられていない場合、コンパイル後の実行ファイルからは、呼び出し自体が削除される。そのため、同様の機能をイベントなどを使って実装するのに比べて、パフォーマンスに優れている。
クラスと構造体
様々な種類の値を格納する複合型としては、クラスと構造体の2種類がある。複合型としては、原則としてクラスを使うべき。構造体を使うのは、以下の条件が満たされる場合に限られる。
- データのサイズが小さい(目安は16バイト以下)
- 絶対に継承しないと分かっている
- 変数への代入がコピーを生むというのが許容できる
constとreadonly
const | readonly |
---|---|
ローカル変数にも使える | クラスのフィールドのみ |
常に静的メンバー扱い | staticの有無を変えられる |
宣言時にのみ初期化可能 | コンストラクター内で値を書き換え可能 |
コンパイル結果はリテラルと同等 | コンパイル結果は変数と同等 |
インスタンスをnewで生成するようなものには使えない | newで生成可能 |
円周率のように絶対に値が変わらない値以外は、public constなメンバー変数にすべきではない。変更の可能性があるpublicな定数は、constではなくreadonlyを使うか、getのみをもつ静的プロパティとして定義すべき。
コンストラクター
C#では、クラス名と同じ名前のメソッドがコンストラクターになる。
初期化子
クラスのフィールドに初期値を与えるには、変数初期化子を用いるやり方と、コンストラクター初期化子を用いるやり方がある。コンストラクター初期化子を使うことで、あるコンストラクターから別のコンストラクターを呼ぶことができる。
using System; namespace Sample { class Person { // 変数初期化子 public string name = "var"; public byte age = 0; // コンストラクター初期化子 public Person() : this("con", 1) { } public Person(string name, byte age) { this.name = name; this.age = age; } } class Program { static void Main(string[] args) { var p = new Person(); Console.WriteLine(p.name); } } }
デストラクター
C#では、クラス名に「~(チルダ)」をつけたメソッドがデストラクターになる。デストラクターはインスタンスが破棄されるタイミングで実行されるが、いつインスタンスが破棄されるかは分からない。いつ実行されるか分からないという性質の扱いづらさから、デストラクターはあまり利用されない。
アクセシビリティ
C#には以下のアクセシビリティがある。
アクセシビリティ | 説明 |
---|---|
public | どこからでもアクセス可能 |
protected | クラス内部と、派生クラスの内部からのみアクセス可能 |
internal | 同一プロジェクト内のクラスからのみアクセス可能 |
protected internal | 同一プロジェクト内のクラス内部、または派生クラスの内部からのみアクセス可能 |
private | クラス内部からのみアクセス可能 |
プロパティ
C#では、外部からはフィールドのように見え、内部ではメソッドとして実装されている「プロパティ」を定義できる。
using System; namespace Sample { class Person { private string name; public string Name { set { this.name = value; } get { return this.name; } } // プロパティの自動実装(機能は上で定義したnameプロパティと同じ) public byte Age { get; set; } } class Program { static void Main(string[] args) { var p = new Person(); p.Name = "john"; p.Age = 20; Console.WriteLine(p.Name); Console.WriteLine(p.Age); } } }
静的コンストラクター
通常のコンストラクターは、クラスのインスタンスが生成されるたびに実行されるが、staticをつけて静的コンストラクターとして宣言すると、そのインスタンスが最初に参照されたときに1回だけ実行される。
静的クラス
クラス定義時にstaticをつけることで、静的メンバーのみをもつ静的クラスを定義できる。