Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Anda mendeklarasikan konstruktor instans untuk menentukan kode yang dijalankan saat Anda membuat instans baru dari jenis dengan new ekspresi. Untuk menginisialisasi kelas statis atau variabel statis di kelas nonstatis, Anda dapat menentukan konstruktor statis.
Seperti yang ditunjukkan contoh berikut, Anda dapat mendeklarasikan beberapa konstruktor instans dalam satu jenis:
class Coords
{
public Coords()
: this(0, 0)
{ }
public Coords(int x, int y)
{
X = x;
Y = y;
}
public int X { get; set; }
public int Y { get; set; }
public override string ToString() => $"({X},{Y})";
}
class Example
{
static void Main()
{
var p1 = new Coords();
Console.WriteLine($"Coords #1 at {p1}");
// Output: Coords #1 at (0,0)
var p2 = new Coords(5, 3);
Console.WriteLine($"Coords #2 at {p2}");
// Output: Coords #2 at (5,3)
}
}
Dalam contoh sebelumnya, konstruktor pertama tanpa parameter memanggil konstruktor kedua dengan kedua argumen sama dengan 0. Untuk melakukannya, gunakan this kata kunci.
Saat Anda mendeklarasikan konstruktor instans di kelas turunan, Anda dapat memanggil konstruktor kelas dasar. Untuk melakukannya, gunakan base kata kunci, seperti yang ditunjukkan contoh berikut:
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() => pi * x * x;
}
class Cylinder : Circle
{
public Cylinder(double radius, double height)
: base(radius)
{
y = height;
}
public override double Area() => (2 * base.Area()) + (2 * pi * x * y);
}
class Example
{
static void Main()
{
double radius = 2.5;
double height = 3.0;
var ring = new Circle(radius);
Console.WriteLine($"Area of the circle = {ring.Area():F2}");
// Output: Area of the circle = 19.63
var tube = new Cylinder(radius, height);
Console.WriteLine($"Area of the cylinder = {tube.Area():F2}");
// Output: Area of the cylinder = 86.39
}
}
Konstruktor tanpa parameter
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 tersebut menginisialisasi instance field dan properti sesuai dengan inisialisator yang bersesuaian. 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.
Jenis struktur selalu menyediakan konstruktor tanpa parameter. Konstruktor tanpa parameter adalah konstruktor tanpa parameter implisit yang menghasilkan nilai default jenis atau konstruktor tanpa parameter yang dideklarasikan secara eksplisit. Untuk informasi selengkapnya, lihat bagian inisialisasi
Konstruktor utama
Mulai dari C# 12, Anda dapat mendeklarasikan konstruktor utama di kelas dan struktur. Anda menyertakan parameter apa pun dalam tanda kurung setelah nama jenis.
public class NamedItem(string name)
{
public string Name => name;
}
Parameter ke konstruktor utama berada dalam cakupan di seluruh isi jenis deklarasikan. Mereka dapat menginisialisasi properti atau bidang. Mereka dapat digunakan sebagai variabel dalam metode atau fungsi lokal. Mereka dapat diteruskan ke konstruktor dasar.
Konstruktor utama menunjukkan bahwa parameter ini wajib untuk setiap instans tipe. Setiap konstruktor yang ditulis secara eksplisit harus menggunakan this(...) sintaks penginisialisasi untuk memanggil konstruktor utama. Itu memastikan bahwa parameter konstruktor utama pasti ditetapkan oleh semua konstruktor. Konstruktor tanpa parameter implisit tidak dipancarkan untuk jenis apa pun class, termasuk jenis record class, ketika konstruktor utama ada. Untuk tipe apa pun struct, termasuk tipe record struct, konstruktor tanpa parameter implisit selalu dihasilkan, dan selalu menginisialisasi semua bidang, termasuk parameter dari konstruktor utama, ke pola 0-bit. Jika Anda menulis konstruktor tanpa parameter eksplisit, konstruktor harus memanggil konstruktor utama. Dalam hal ini, Anda dapat menentukan nilai yang berbeda untuk parameter konstruktor utama. Kode berikut menunjukkan contoh konstruktor utama.
// name isn't captured in Widget.
// width, height, and depth are captured as private fields
public class Widget(string name, int width, int height, int depth) : NamedItem(name)
{
public Widget() : this("N/A", 1,1,1) {} // unnamed unit cube
public int WidthInCM => width;
public int HeightInCM => height;
public int DepthInCM => depth;
public int Volume => width * height * depth;
}
Anda dapat menambahkan atribut ke metode konstruktor utama yang disintesis dengan menentukan method: target pada atribut :
[method: MyAttribute]
public class TaggedWidget(string name)
{
// details elided
}
Jika Anda tidak menentukan method target, atribut akan ditempatkan pada kelas ketimbang metode.
Dalam tipe class dan struct, parameter konstruktor utama tersedia di mana saja dalam badan tipe. Parameter dapat diimplementasikan sebagai bidang privat yang ditangkap. Jika satu-satunya referensi ke parameter adalah inisialisasi dan panggilan konstruktor, parameter tersebut tidak disimpan dalam bidang privat. Penggunaan dalam anggota lain dari jenis ini menyebabkan pengompiler menangkap parameter di dalam bidang privat.
Jika jenis menyertakan record pengubah, pengkompilasi sebagai gantinya mensintesis properti publik dengan nama yang sama dengan parameter konstruktor utama. Untuk record class jenis, jika parameter konstruktor utama menggunakan nama yang sama dengan konstruktor utama dasar, properti tersebut adalah properti publik dari jenis dasar record class . Ini tidak diduplikasi dalam jenis turunan record class . Properti ini tidak dihasilkan untuk non-jenisrecord .