インスタンス コンストラクター (C# プログラミング ガイド)
インスタンス コンストラクターを使用すると、new 式を使用してクラスのオブジェクトを作成する際に、任意のインスタンス メンバー変数を作成および初期化できます。 静的クラスを初期化する場合や、非静的クラスの静的変数を初期化する場合は、静的コンストラクターを定義する必要があります。 詳細については、「静的コンストラクター (C# プログラミング ガイド)」を参照してください。
インスタンス コンストラクターの例を次に示します。
class CoOrds
{
public int x, y;
// constructor
public CoOrds()
{
x = 0;
y = 0;
}
}
注意
このクラスにはパブリック フィールドが含まれていますが、これはわかりやすくするためです。 パブリック フィールドの使用は、推奨されるプログラミング手法ではありません。この場合、プログラム内のすべてのメソッドに、オブジェクトの内部処理への無制限で検証されないアクセスが許可されるからです。 通常、データ メンバーはプライベートにし、クラス メソッドとプロパティのみを介してアクセスする必要があります。
このインスタンス コンストラクターは、CoOrds クラスからオブジェクトを作成するときに呼び出されます。 引数を取らないこのようなコンストラクターを既定のコンストラクターと呼びます。 これは、コンストラクターを追加する場合に便利です。 たとえば、CoOrds クラスに、データ メンバーの初期値を指定できるコンストラクターを追加できます。
// tcA constructor with two arguments:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
これにより、次のように、既定値や特定の初期値を使って CoOrd オブジェクトを作成できます。
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
クラスにコンストラクターがない場合は、既定のコンストラクターが自動的に生成され、既定値を使用してオブジェクト フィールドが初期化されます。 たとえば、int は 0 に初期化されます。 既定値の詳細については、「既定値の一覧表 (C# リファレンス)」を参照してください。 したがって、CoOrds クラスの既定のコンストラクターはすべてのデータ メンバーをゼロに初期化するので、クラスの機能を変更せずに完全に削除できます。 下の「例 1」は複数のコンストラクターを使用する完全な例で、「例 2」は自動的に生成されるコンストラクターの例を示しています。
また、インスタンス コンストラクターを使用すると、基本クラスのインスタンス コンストラクターを呼び出すこともできます。 クラス コンストラクターは、初期化子を通じて基本クラスのコンストラクターを呼び出すことができます。次にその例を示します。
class Circle : Shape
{
public Circle(double radius)
: base(radius, 0)
{
}
}
この例の Circle クラスは、Circle の派生元の Shape によって提供されるコンストラクターに、半径と高さを表す値を渡します。 下の「例 3」は、Shape と Circle を使用する完全な例を示しています。
例 1
次の例は、クラス コンストラクターを 2 つ使用するクラスを示しています。1 つのコンストラクターには引数がなく、もう 1 つのコンストラクターには引数が 2 つあります。
class CoOrds
{
public int x, y;
// Default constructor:
public CoOrds()
{
x = 0;
y = 0;
}
// tcA constructor with two arguments:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
// Override the ToString method:
public override string ToString()
{
return (String.Format("({0},{1})", x, y));
}
}
class MainClass
{
static void Main()
{
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
// Display the results using the overriden ToString method:
Console.WriteLine("CoOrds #1 at {0}", p1);
Console.WriteLine("CoOrds #2 at {0}", p2);
Console.ReadKey();
}
}
/* Output:
CoOrds #1 at (0,0)
CoOrds #2 at (5,3)
*/
例 2
次の例の Person クラスにはコンストラクターがありません。この場合は、既定のコンストラクターが自動的に使用され、フィールドは既定値に初期化されます。
public class Person
{
public int age;
public string name;
}
class TestPerson
{
static void Main()
{
Person person = new Person();
Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: Name: , Age: 0
age の既定値は 0、name の既定値は null です。 既定値の詳細については、「既定値の一覧表 (C# リファレンス)」を参照してください。
例 3
次の例は、基本クラスの初期化子の使い方を示しています。 Circle クラスは一般的なクラス Shape から派生しており、Cylinder クラスは Circle クラスから派生しています。 どちらの派生クラスのコンストラクターも、基本クラスの初期化子を使用しています。
abstract class Shape
{
public const double pi = Math.PI;
protected double x, y;
public Shape(double x, double y)
{
this.x = x;
this.y = y;
}
public abstract double Area();
}
class Circle : Shape
{
public Circle(double radius)
: base(radius, 0)
{
}
public override double Area()
{
return pi * x * x;
}
}
class Cylinder : Circle
{
public Cylinder(double radius, double height)
: base(radius)
{
y = height;
}
public override double Area()
{
return (2 * base.Area()) + (2 * pi * x * y);
}
}
class TestShapes
{
static void Main()
{
double radius = 2.5;
double height = 3.0;
Circle ring = new Circle(radius);
Cylinder tube = new Cylinder(radius, height);
Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Area of the circle = 19.63
Area of the cylinder = 86.39
*/
基本クラスのコンストラクターを呼び出すその他の例については、「virtual (C# リファレンス)」、「override (C# リファレンス)」、および「base (C# リファレンス)」を参照してください。