コンストラクターの定義
パラメーター付きコンストラクターでインスタンスを作成します。
「コンストラクターの定義」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
コンストラクターとは
コンストラクターは、new でオブジェクトが作成されたときに実行される特別なメソッドです。クラスと同じ名前を持ち、戻り値の型はありません。オブジェクトを有効な初期状態にすることが役割です。
using System;
class Dog
{
public Dog()
{
Console.WriteLine("A dog was created");
}
}
class Program
{
static void Main()
{
var d = new Dog();
}
}パラメーター付きコンストラクター
コンストラクターにはパラメーターを指定できるため、呼び出し元から初期値を渡せます。必要なデータを設定する最も一般的なパターンです。
using System;
class Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main()
{
var p = new Person("Ada", 36);
Console.WriteLine(p.Name + " is " + p.Age);
}
}コンストラクターでの this キーワード
パラメーター名がフィールド名と一致する場合は、this. を使ってフィールドを参照し、パラメーターと区別します。
using System;
class Book
{
public string Title;
public Book(string title)
{
this.Title = title;
}
}
class Program
{
static void Main()
{
var b = new Book("C# Basics");
Console.WriteLine(b.Title);
}
}既定のコンストラクター
コンストラクターを 1 つも記述しない場合、コンパイラーがパラメーターなしのコンストラクターを提供します。ただし、いずれかのコンストラクターを定義すると、その既定のコンストラクターは自動的には用意されなくなるため、必要なら自分で追加してください。
using System;
class Empty
{
// No constructor written -> compiler supplies a default one
public int Value;
}
class Program
{
static void Main()
{
var e = new Empty();
Console.WriteLine("Default Value: " + e.Value);
}
}コンストラクターでの検証
コンストラクターで引数を検証すると、オブジェクトが無効な状態で作成されないことを保証できます。
using System;
class Account
{
public decimal Balance;
public Account(decimal initial)
{
if (initial < 0)
throw new ArgumentException("Initial balance cannot be negative");
Balance = initial;
}
}
class Program
{
static void Main()
{
var a = new Account(100m);
Console.WriteLine("Balance: " + a.Balance);
}
}コンストラクターのオーバーロード
クラスには、パラメーターリストが異なる複数のコンストラクターを定義できます。コンパイラーが渡された引数に一致するものを選択します。
using System;
class Point
{
public int X;
public int Y;
public Point()
{
X = 0;
Y = 0;
}
public Point(int x, int y)
{
X = x;
Y = y;
}
}
class Program
{
static void Main()
{
var origin = new Point();
var p = new Point(3, 4);
Console.WriteLine(origin.X + "," + origin.Y + " | " + p.X + "," + p.Y);
}
}コンストラクターからのプロパティ設定
コンストラクターでは、自動実装プロパティに値を代入することがよくあります。init 専用のプロパティや private setter を持つプロパティにも代入できます。
using System;
class Product
{
public string Name { get; }
public decimal Price { get; }
public Product(string name, decimal price)
{
Name = name;
Price = price;
}
}
class Program
{
static void Main()
{
var p = new Product("Pen", 1.50m);
Console.WriteLine(p.Name + ": " + p.Price);
}
}パラメーターの既定値
コンストラクターのパラメーターには既定値を指定できるため、呼び出し元はそのパラメーターを省略できます。これにより、複数のオーバーロードが不要になることもよくあります。
using System;
class Circle
{
public double Radius;
public string Color;
public Circle(double radius, string color = "black")
{
Radius = radius;
Color = color;
}
}
class Program
{
static void Main()
{
var c1 = new Circle(2);
var c2 = new Circle(3, "red");
Console.WriteLine(c1.Color + " | " + c2.Color);
}
}コンストラクターでの処理
コンストラクターではフィールドへの代入だけでなく、派生データの計算や、オブジェクトに必要なリソースの準備も行えます。
using System;
class Rectangle
{
public double Width;
public double Height;
public double Area;
public Rectangle(double w, double h)
{
Width = w;
Height = h;
Area = w * h;
}
}
class Program
{
static void Main()
{
var r = new Rectangle(4, 5);
Console.WriteLine("Area: " + r.Area);
}
}コンストラクターと必須データ
必須の値をコンストラクターで受け取ると、その値の指定が必須になります。値を渡さずにオブジェクトを作成することはできません。
using System;
class User
{
public string Id;
public string Email;
public User(string id, string email)
{
Id = id;
Email = email;
}
}
class Program
{
static void Main()
{
var u = new User("u1", "a@b.com");
Console.WriteLine(u.Id + " / " + u.Email);
}
}全体を組み立てる
適切に設計されたコンストラクターは入力を検証し、フィールドに値を設定して、オブジェクトをすぐに使える状態にします。
using System;
class Temperature
{
public double Celsius { get; }
public double Fahrenheit { get; }
public Temperature(double celsius)
{
if (celsius < -273.15)
throw new ArgumentException("Below absolute zero");
Celsius = celsius;
Fahrenheit = celsius * 9 / 5 + 32;
}
}
class Program
{
static void Main()
{
var t = new Temperature(25);
Console.WriteLine(t.Celsius + "C = " + t.Fahrenheit + "F");
}
}理解度チェック
コンストラクターについての理解度を確認しましょう。
まとめ
コンストラクターはクラス名と同じ名前を持ち、戻り値の型を持たず、new の実行時に呼び出されます。パラメーター付きコンストラクターでは初期値を受け取り、this. によってフィールドとパラメーターを区別できます。コンストラクターはオーバーロードでき、パラメーターに既定値を設定することもできます。コンストラクターを1つでも定義すると、自動生成される既定のコンストラクターはなくなります。
using System;
class Demo
{
public string Name;
public Demo(string name = "anon")
{
this.Name = name;
}
}
class Program
{
static void Main()
{
Console.WriteLine(new Demo().Name);
Console.WriteLine(new Demo("Kai").Name);
}
}よくある質問
「コンストラクターの定義」レッスンは無料ですか?
はい。「コンストラクターの定義」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「コンストラクターの定義」で何を学びますか?
パラメーター付きコンストラクターでインスタンスを作成します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「コンストラクターの定義」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。