Membuat konstruktor kelas dan membuat instans objek
Selain properti dan metode kelas, definisi kelas termasuk konstruktor yang digunakan untuk menginisialisasi objek baru (instans kelas).
Konstruktor kelas
Konstruktor kelas adalah metode dengan nama yang sama dengan jenisnya (metode konstruktor menggunakan nama yang sama dengan kelas ).
Ada dua jenis konstruktor kelas:
- Konstruktor instans. Konstruktor instans digunakan untuk membuat dan menginisialisasi variabel bidang instans apa pun saat objek dibuat.
- Konstruktor statis. Konstruktor statis digunakan untuk menginisialisasi data statis apa pun, atau untuk melakukan tindakan tertentu yang perlu dilakukan hanya sekali. Konstruktor statis dipanggil secara otomatis sebelum instans pertama dibuat atau anggota statis apa pun direferensikan.
Konstruktor kelas adalah konstruktor instans secara default.
Sintaks konstruktor instans
Konstruktor instans dinyatakan menggunakan nama yang sama dengan kelas dan tidak menyertakan jenis pengembalian. Tanda tangan metode konstruktor dapat mencakup pengubah akses opsional, nama metode, dan daftar parameternya. Tanda tangan metode konstruktor tidak menyertakan jenis pengembalian.
Contoh berikut menunjukkan konstruktor sederhana untuk kelas bernama Person:
public class Person
{
public Person()
{
// Field initialization and constructor logic goes here.
}
// Remaining implementation of Person class.
}
Kelas dapat memiliki lebih dari satu konstruktor. Ketika kelas memiliki lebih dari satu konstruktor, konstruktor biasanya mengambil argumen yang berbeda.
Contoh berikut menunjukkan kelas bernama Person dengan dua konstruktor.
public class Person
{
public Person()
{
// Field initialization and constructor logic goes here.
string name = "Person One";
Console.WriteLine($"Person created: {name}");
}
public Person(string fName, string lName)
{
string name = fName + " " + lName;
Console.WriteLine($"Person created: {name}");
}
// Remaining implementation of Person class.
}
Membuat instans objek menggunakan konstruktor kelas
Saat objek dibuat menggunakan kata kunci new, runtime .NET memanggil konstruktor instans terkait dalam definisi kelas, dan mengalokasikan memori untuk objek.
Dalam cuplikan kode berikut, kelas Person mendefinisikan konstruktor instans sederhana. Kelas Program mencakup metode Main yang menggunakan operator new untuk membuat instans Person bernama person1. Runtime memanggil konstruktor Person segera setelah memori dialokasikan untuk objek baru.
public class Person
{
public Person()
{
// Field initialization and constructor logic goes here.
}
}
static class Program
{
// the Main method is the entry point of the program.
static void Main()
{
Person person1 = new Person();
}
}
Konstruktor dengan dan tanpa parameter
Konstruktor yang tidak mengambil parameter disebut konstruktor tanpa parameter. Runtime memanggil konstruktor tanpa parameter saat objek dibuat menggunakan operator new dan tidak ada argumen yang diberikan kepada konstruktor.
Nota
Kecuali kelas bersifat statis, kelas tanpa konstruktor diberikan konstruktor tanpa parameter publik oleh kompilator C# untuk mengaktifkan instansiasi kelas.
Kelas sering mendefinisikan konstruktor yang mengambil parameter. Konstruktor yang mengambil parameter harus dipanggil menggunakan operator new atau pernyataan dasar. Kelas dapat menentukan satu atau beberapa konstruktor.
Cuplikan kode berikut menunjukkan kelas bernama Person dengan tiga konstruktor:
public class Person
{
public Person()
{
// Field initialization and constructor logic goes here.
Console.WriteLine("An instance of the Person class is being instantiated without name or age parameters.");
}
public Person(string name)
{
// Field initialization and constructor logic goes here.
Console.WriteLine($"An instance of the Person class is being instantiated using a name ({name}) parameter.");
}
public Person(string name, int age)
{
// Field initialization and constructor logic goes here.
Console.WriteLine($"An instance of the Person class is being instantiated using name ({name}) and age ({age}) parameters.");
}
}
static class Program
{
// the Main method is the entry point of the program.
static void Main()
{
Person person1 = new Person();
Person person2 = new Person("Person Two");
Person person3 = new Person("Person Three", 30);
}
}
Kelas tanpa konstruktor
Jika kelas tidak memiliki konstruktor instans eksplisit, C# menyediakan konstruktor tanpa parameter yang dapat Anda gunakan untuk membuat instans kelas tersebut, seperti yang ditunjukkan contoh berikut:
public class Person
{
public int age;
public string name = "unknown";
}
class Example
{
static void Main()
{
var person = new Person();
Console.WriteLine($"Name: {person.name}, Age: {person.age}");
// Output: Name: unknown, Age: 0
}
}
Konstruktor ini menginisialisasi bidang instans dan properti sesuai dengan inisialisasi yang sesuai. Jika bidang atau properti tidak memiliki penginisialisasi, nilainya diatur ke nilai default jenis bidang atau properti. Jika Anda mendeklarasikan setidaknya satu konstruktor instans di kelas, C# tidak menyediakan konstruktor tanpa parameter.
Menginisialisasi data kelas menggunakan parameter konstruktor
Parameter yang diteruskan ke konstruktor bersifat lokal untuk konstruktor. Parameter sering digunakan untuk menginisialisasi bidang data kelas.
Cuplikan kode berikut menunjukkan kelas bernama Person dengan konstruktor yang menginisialisasi bidang personName dan personAge:
public class Person
{
public string personName;
public string personAge;
public Person()
{
// Field initialization and constructor logic goes here.
personName = "unknown";
personAge = "unknown";
}
public Person(string name)
{
// Field initialization and constructor logic goes here.
personName = name;
personAge = "unknown";
}
public Person(string name, int age)
{
// Field initialization and constructor logic goes here.
personName = name;
personAge = age.ToString();
}
}
static class Program
{
// the Main method is the entry point of the program.
static void Main()
{
Person person1 = new Person();
Person person2 = new Person("Person Two");
Person person3 = new Person("Person Three", 30);
Console.WriteLine($"Person 1 Name: {person1.personName} Age: {person1.personAge}");
Console.WriteLine($"Person 2 Name: {person2.personName} Age: {person2.personAge}");
Console.WriteLine($"Person 3 Name: {person3.personName} Age: {person3.personAge}");
}
}
Dalam contoh sebelumnya, kelas Person didefinisikan dengan tiga konstruktor. Konstruktor pertama menginisialisasi bidang personName dan personAge untuk "unknown". Konstruktor kedua menginisialisasi bidang personName ke nilai yang diteruskan dalam parameter name dan bidang personAge untuk "unknown". Konstruktor ketiga menginisialisasi bidang personName dan personAge ke nilai yang diteruskan dalam parameter name dan age.
Karena bidang bersifat publik, bidang tersebut dapat diakses langsung dari metode Main. Saat kode berjalan, output berikut dihasilkan:
Person 1 Name: unknown Age: unknown
Person 2 Name: Person Two Age: unknown
Person 3 Name: Person Three Age: 30
Definisi isi ekspresi
Jika konstruktor dapat diimplementasikan sebagai pernyataan tunggal, Anda dapat menggunakan definisi isi ekspresi untuk menetapkan parameter ke anggota kelas saat konstruktor diimplementasikan.
Misalnya, konstruktor berikut menginisialisasi bidang modelName dengan nilai yang diteruskan ke parameter model:
public class Car
{
public string modelName;
public Car(string model) => modelName = model;
}
Kelas Car memiliki satu bidang publik, modelName, yang berjenis string. Bidang modelName dimaksudkan untuk menyimpan nama model mobil.
Kelas Car juga menyertakan konstruktor yang mengambil parameter string tunggal bernama model. Konstruktor menggunakan definisi isi ekspresi (ditandai dengan sintaks =>) untuk menginisialisasi bidang modelName dengan nilai yang diteruskan ke parameter model. Ini berarti bahwa ketika objek Car baru dibuat, bidang modelName diatur ke nilai yang disediakan sebagai argumen ke konstruktor.
Seperti istilah ekspresi, sisi kanan operator => adalah ekspresi dan tidak terbatas pada pernyataan penugasan sederhana. Ekspresi dapat berupa ekspresi C# valid yang mengembalikan nilai.
Cuplikan kode berikut menunjukkan cara mengimplementasikan definisi isi ekspresi yang melakukan perhitungan sederhana:
public class Employee
{
public int Salary;
public Employee() { }
public Employee(int annualSalary) => Salary = annualSalary;
public Employee(int weeklySalary, int numberOfWeeks) => Salary = weeklySalary * numberOfWeeks;
}
Kelas ini dapat dibuat dengan menggunakan salah satu pernyataan berikut:
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);
Konstruktor statis
Konstruktor statis digunakan untuk menginisialisasi data statis apa pun, atau untuk melakukan tindakan tertentu yang perlu dilakukan hanya sekali. Ini dipanggil secara otomatis sebelum instans pertama dibuat atau anggota statis apa pun direferensikan. Konstruktor statis dipanggil paling banyak sekali.
Cuplikan kode berikut menunjukkan versi terbaru dari kelas Person yang mengimplementasikan bidang statis dan konstruktor statis:
public class Person
{
public string personName;
public string personAge;
// Static field
public static string defaultName;
public static string defaultAge;
// Static constructor
static Person()
{
// Static field initialization
defaultName = "unknown";
defaultAge = "unknown";
}
public Person()
{
// Field initialization and constructor logic goes here.
personName = defaultName;
personAge = defaultAge;
}
public Person(string name)
{
// Field initialization and constructor logic goes here.
personName = name;
personAge = defaultAge;
}
public Person(string name, int age)
{
// Field initialization and constructor logic goes here.
personName = name;
personAge = age.ToString();
}
}
Kelas Person yang diperbarui memiliki dua bidang instans, personName dan personAge, yang keduanya berjenis string. Bidang-bidang ini masing-masing menyimpan nama dan usia seseorang.
Kelas ini juga mendefinisikan dua bidang statis, defaultName dan defaultAge, juga dari jenis string. Bidang statis dibagikan di antara semua instans kelas dan hanya diinisialisasi sekali. Dalam hal ini, bidang statis digunakan untuk menyediakan nilai default untuk bidang personName dan personAge.
Konstruktor statis static Person() bertanggung jawab untuk menginisialisasi bidang statis. Ini mengatur defaultName ke "unknown" dan defaultAge ke "unknown". Konstruktor statis dipanggil secara otomatis sebelum instans kelas dibuat atau anggota statis apa pun diakses.
Kelas Person mencakup tiga konstruktor instans:
Konstruktor tanpa parameter public Person() menginisialisasi bidang personName dan personAge dengan nilai bidang statis defaultName dan defaultAge. Ini berarti bahwa jika tidak ada argumen yang disediakan saat membuat objek Person, nilai default "unknown" digunakan untuk nama dan usia.
Konstruktor public Person(string name) mengambil satu parameter, name, dan menginisialisasi bidang personName dengan nilai ini. Bidang personAge diinisialisasi dengan nilai bidang statis defaultAge. Konstruktor ini memungkinkan pembuatan objek Person dengan nama tertentu saat menggunakan usia default.
Konstruktor public Person(string name, int age) mengambil dua parameter, name dan age. Ini menginisialisasi bidang personName dengan nilai parameter name dan bidang personAge dengan representasi string parameter usia. Konstruktor ini memungkinkan pembuatan objek Person dengan name dan ageyang ditentukan.
Properti konstruktor statis
Konstruktor statis memiliki properti berikut:
Konstruktor statis tidak mengambil pengubah akses atau memiliki parameter.
Kelas hanya dapat memiliki satu konstruktor statis.
Konstruktor statis tidak dapat diwariskan atau kelebihan beban.
Konstruktor statis tidak dapat dipanggil secara langsung dan hanya dimaksudkan untuk dipanggil oleh runtime bahasa umum (CLR). Ini dipanggil secara otomatis.
Pengguna tidak memiliki kontrol pada kapan konstruktor statis dijalankan dalam program.
Konstruktor statis dipanggil secara otomatis. Ini menginisialisasi kelas sebelum instans pertama dibuat atau anggota statis apa pun yang dideklarasikan di kelas tersebut (bukan kelas dasarnya) direferensikan. Konstruktor statis berjalan sebelum konstruktor instans. Jika penginisialisasi variabel bidang statis ada di kelas konstruktor statis, mereka berjalan dalam urutan tekstual di mana mereka muncul dalam deklarasi kelas. Penginisialisasi berjalan segera sebelum konstruktor statis.
Jika Anda tidak menyediakan konstruktor statis untuk menginisialisasi bidang statis, semua bidang statis diinisialisasi ke nilai defaultnya.
Jika konstruktor statis melempar pengecualian, runtime tidak memanggilnya untuk kedua kalinya, dan jenisnya tetap tidak diinisialisasi untuk masa pakai domain aplikasi. Paling umum, pengecualian
TypeInitializationExceptiondilemparkan ketika konstruktor statis tidak dapat membuat instans jenis atau untuk pengecualian yang tidak tertangani yang terjadi dalam konstruktor statis. Untuk konstruktor statis yang tidak secara eksplisit ditentukan dalam kode sumber, pemecahan masalah mungkin memerlukan inspeksi kode bahasa perantara (IL).Kehadiran konstruktor statis mencegah penambahan atribut jenis
BeforeFieldInit. Ini membatasi pengoptimalan runtime.Bidang yang dinyatakan sebagai
static readonlyhanya dapat ditetapkan sebagai bagian dari deklarasinya atau dalam konstruktor statis. Ketika konstruktor statis eksplisit tidak diperlukan, inisialisasi bidang statis pada deklarasi daripada melalui konstruktor statis untuk pengoptimalan runtime yang lebih baik.Runtime memanggil konstruktor statis tidak lebih dari sekali dalam satu domain aplikasi. Panggilan tersebut dilakukan di wilayah terkunci berdasarkan jenis kelas tertentu. Tidak ada mekanisme penguncian tambahan yang diperlukan dalam isi konstruktor statis.
Nota
Meskipun tidak dapat diakses secara langsung, kehadiran konstruktor statis eksplisit harus didokumentasikan untuk membantu memecahkan masalah pengecualian inisialisasi.