Bagikan melalui


Pengantar kelas

Jenis referensi

Tipe yang didefinisikan sebagai class adalah tipe referensi. Pada durasi, saat Anda mendeklarasikan variabel jenis referensi, variabel berisi nilai null hingga Anda secara eksplisit membuat instans kelas dengan menggunakan operator new, atau menetapkannya objek dari jenis yang kompatibel yang mungkin telah dibuat di tempat lain, seperti yang ditunjukkan dalam contoh berikut:

//Declaring an object of type MyClass.
MyClass mc = new MyClass();

//Declaring another object of the same type, assigning it the value of the first object.
MyClass mc2 = mc;

Saat objek dibuat, memori yang cukup dialokasikan pada heap terkelola untuk objek spesifik itu, dan variabel hanya menyimpan referensi ke lokasi objek tersebut. Memori yang digunakan oleh objek direklamasi oleh fungsionalitas manajemen memori otomatis CLR, yang dikenal sebagai pengumpulan sampah. Untuk informasi selengkapnya tentang pengumpulan sampah, lihatlah Manajemen memori otomatis dan pengumpulan sampah.

Mendeklarasikan kelas

Kelas dideklarasikan dengan menggunakan kata kunci class diikuti dengan pengenal unik, seperti yang ditunjukkan pada contoh berikut:

//[access modifier] - [class] - [identifier]
public class Customer
{
   // Fields, properties, methods and events go here...
}

Pengubah akses opsional mendahului class kata kunci. Karena public digunakan dalam kasus ini, siapa pun dapat membuat instans dari kelas ini. Nama kelas mengikuti kata kunci class. Nama kelas harus berupa nama pengenal C# yang valid. Sisa dari definisi adalah badan kelas, di mana perilaku dan data yang didefinisikan. Bidang, properti, metode, dan acara di kelas secara kolektif disebut sebagai anggota kelas.

Membuat objek-objek

Meskipun terkadang digunakan secara bergantian, kelas dan objek adalah hal yang berbeda. Kelas mendefinisikan jenis objek, tetapi bukan objek itu sendiri. Objek adalah entitas konkret berdasarkan kelas, dan kadang-kadang disebut sebagai instans dari kelas.

Objek dapat dibuat dengan menggunakan new kata kunci diikuti dengan nama kelas, seperti ini:

Customer object1 = new Customer();

Ketika sebuah instans dari sebuah kelas dibuat, referensi ke objek dilewatkan kembali ke programmer. Pada contoh sebelumnya, object1 adalah referensi ke objek yang didasarkan pada Customer. Referensi ini mengacu pada objek baru tetapi tidak berisi data objek itu sendiri. Bahkan, Anda dapat membuat referensi objek tanpa membuat objek sama sekali:

Customer object2;

Kami tidak menyarankan pembuatan referensi objek yang tidak merujuk ke objek karena mencoba mengakses objek melalui referensi seperti itu gagal pada waktu proses. Referensi dapat dibuat untuk merujuk ke objek, baik dengan membuat objek baru, atau dengan menetapkannya objek yang sudah ada, seperti ini:

Customer object3 = new Customer();
Customer object4 = object3;

Kode ini membuat dua referensi objek yang sama-sama merujuk ke objek yang sama. Oleh karena itu, setiap perubahan pada objek yang dilakukan object3 tercermin dalam penggunaan berikutnya dari object4. Karena objek yang didasarkan pada kelas dirujuk dengan referensi, kelas dikenal sebagai tipe referensi.

Konstruktor dan inisialisasi

Bagian sebelumnya memperkenalkan sintaks untuk mendeklarasikan jenis kelas dan membuat instans jenis tersebut. Saat Anda membuat instans jenis, Anda ingin memastikan bahwa bidang dan propertinya diinisialisasi ke nilai yang berguna. Ada beberapa cara untuk menginisialisasi nilai:

  • Menerima nilai default
  • Penginisialisasi bidang
  • Parameter konstruktor
  • Penginisialisasi objek

Setiap jenis .NET memiliki nilai default. Biasanya, nilai tersebut adalah 0 untuk jenis angka, dan null untuk semua jenis referensi. Anda dapat mengandalkan nilai default tersebut saat masuk akal di aplikasi Anda.

Saat default .NET bukan nilai yang tepat, Anda dapat mengatur nilai awal menggunakan penginisialisasi bidang:

public class Container
{
    // Initialize capacity field to a default value of 10:
    private int _capacity = 10;
}

Anda dapat mengharuskan penelepon untuk memberikan nilai awal dengan menentukan konstruktor yang bertanggung jawab untuk mengatur nilai awal tersebut:

public class Container
{
    private int _capacity;

    public Container(int capacity) => _capacity = capacity;
}

Dimulai dengan C# 12, Anda dapat menentukan konstruktor utama sebagai bagian dari deklarasi kelas:

public class Container(int capacity)
{
    private int _capacity = capacity;
}

Menambahkan parameter ke nama kelas menentukan konstruktor utama. Parameter tersebut tersedia di isi kelas, yang mencakup anggotanya. Anda dapat menggunakannya untuk menginisialisasi bidang atau di tempat lain yang diperlukan.

Anda juga dapat menggunakan pengubah required pada properti dan mengizinkan penelepon menggunakan penginisialisasi objek untuk mengatur nilai awal properti:

public class Person
{
    public required string LastName { get; set; }
    public required string FirstName { get; set; }
}

Penambahan required kata kunci mengamanatkan bahwa penelepon harus mengatur properti tersebut sebagai bagian new dari ekspresi:

var p1 = new Person(); // Error! Required properties not set
var p2 = new Person() { FirstName = "Grace", LastName = "Hopper" };

Warisan kelas

Kelas-kelas sepenuhnya mendukung pewarisan, karakteristik mendasar dari pemrograman berorientasi objek. Saat membuat kelas, Anda dapat mewarisi dari kelas lain yang tidak didefinisikan sebagai sealed. Kelas lain dapat mewarisi dari kelas Anda dan mengambil alih metode virtual kelas. Selanjutnya, Anda dapat mengimplementasikan satu atau lebih antarmuka.

Pewarisan dilakukan dengan menggunakan derivasi, yang berarti suatu kelas dideklarasikan dengan menggunakan kelas dasar yang mewarisi data dan perilaku. Kelas dasar ditentukan dengan menambahkan titik dua dan nama kelas dasar mengikuti nama kelas turunan seperti ini:

public class Manager : Employee
{
    // Employee fields, properties, methods and events are inherited
    // New Manager fields, properties, methods and events go here...
}

Ketika deklarasi kelas menyertakan kelas dasar, ia mewarisi semua anggota kelas dasar kecuali konstruktor. Untuk informasi selengkapnya, lihat Warisan.

Kelas dalam C# hanya dapat mewarisi secara langsung dari satu kelas dasar. Namun, karena kelas dasar mungkin sendiri mewarisi dari kelas lain, kelas mungkin secara tidak langsung mewarisi beberapa kelas dasar. Selanjutnya, sebuah kelas dapat langsung mengimplementasikan satu atau lebih antarmuka. Untuk informasi lebih lanjut, lihat Antarmuka .

Kelas dapat dinyatakan sebagai abstract. Kelas abstrak berisikan metode abstrak yang memiliki definisi tanda tangan tetapi tidak ada implementasi. Kelas abstrak tidak dapat diinstansiasi. Mereka hanya bisa digunakan melalui kelas turunan yang mengimplementasikan metode abstrak. Sebaliknya, kelas yang disegel tidak memungkinkan kelas lain untuk berasal dari kelas tersebut. Untuk informasi lebih lanjut, lihat Kelas Abstrak dan Tertutup serta Anggota Kelas.

Definisi kelas dapat dibagi di antara file sumber yang berbeda. Untuk informasi selengkapnya, lihat Kelas dan Metode Parsial.

Spesifikasi Bahasa C#

Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.