Bagikan melalui


Konstruktor instans (panduan pemrograman C#)

Anda mendeklarasikan konstruktor instans untuk menentukan kode yang dijalankan saat Anda membuat instans jenis baru dengan ekspresi new. 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 melakukan hal tersebut, gunakan kata kunci this.

Saat Anda mendeklarasikan konstruktor instans di kelas turunan, Anda dapat memanggil konstruktor dari kelas dasar. Untuk melakukan hal tersebut, gunakan kata kunci base, 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 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 bidang dan properti instans sesuai dengan penginisialisasi yang sesuai. Jika bidang atau properti tidak memiliki penginisialisasi, nilai diatur ke nilai default dari jenis bidang atau properti. Jika Anda mendeklarasikan setidaknya satu konstruktor instans dalam 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 lebih lanjut, lihat bagian Inisialisasi struktur dan nilai default dari artikel Jenis struktur.

Konstruktor utama

Mulai dari C# 12, Anda dapat mendeklarasikan konstruktor utama di kelas dan struktur. Anda menempatkan parameter apa pun dalam tanda kurung dengan mengikuti 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 diperlukan untuk setiap instans jenis. 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. Untuk jenis apa pun class , termasuk record class jenis, konstruktor tanpa parameter implisit tidak dipancarkan saat konstruktor utama ada. Untuk jenis apa pun struct , termasuk record struct jenis, konstruktor tanpa parameter implisit selalu dipancarkan, dan selalu menginisialisasi semua bidang, termasuk parameter 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 ditempatkan pada kelas daripada metode .

Dalam class dan struct jenis, parameter konstruktor utama tersedia di mana saja dalam isi jenis. Parameter dapat diimplementasikan sebagai bidang privat yang ditangkap. Jika satu-satunya referensi ke parameter adalah inisialisasi dan panggilan konstruktor, parameter tersebut tidak diambil di bidang privat. Menggunakan anggota lain dari jenis menyebabkan pengkompilasi mengambil parameter di 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 .

Lihat juga