Menu

Class dan Object C#: Field, Method, new, dan Reference

Cara mendeklarasikan class di C#, memberinya field dan method, membuat object dengan new, dan apa artinya class adalah tipe reference: object yang dipakai bersama, null dan NullReferenceException, ToString, serta object initializer.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Class adalah tipe yang kamu definisikan sendiri: class mengelompokkan data (field) dengan kode yang bekerja pada data itu (method). Object adalah satu instance dari sebuah class, dibuat saat program berjalan dengan new. Satu class, banyak object, masing-masing dengan nilainya sendiri.

Mendeklarasikan class dan membuat object

Deklarasi class mencantumkan member-nya di dalam kurung kurawal. Field menyimpan data, method menyimpan perilaku. new ClassName() mengalokasikan sebuah object dan memberimu reference ke object itu.

Output:

Maya: 120.50
Omar: 40
Withdraw 200 succeeded: False

Setiap object punya Owner dan Balance sendiri. Di dalam method, Balance berarti "saldo milik object tempat method ini dipanggil", itulah sebabnya maya.Deposit dan omar.Deposit mengubah angka yang berbeda. Object implisit itu tersedia sebagai this saat kamu perlu menyebutnya.

Field yang tidak kamu assign dimulai dengan nilai default-nya: 0 untuk angka, false untuk bool, dan null untuk string dan tipe class lainnya.

Member di sini dibuat public supaya Main bisa menjangkaunya. Class sungguhan biasanya membuat field-nya private dan menyediakan property sebagai gantinya, dan aturannya ada di halaman access modifier. Sebuah class juga bisa mendeklarasikan constructor untuk mengisi field-nya saat object dibuat, yang dibahas di halaman constructor.

Class adalah tipe reference

Variabel bertipe class tidak berisi object-nya. Variabel itu berisi reference ke object yang berada di heap. Meng-assign variabel itu menyalin reference-nya, jadi dua variabel bisa menunjuk ke object yang sama.

Output:

5
6
True
False

Ada tiga konsekuensi yang terlihat di sini:

  • Mengubah object lewat second terlihat juga lewat first, karena object-nya hanya satu.
  • Mengirim object ke method berarti mengirim reference-nya. Method itu bisa mengubah field object, dan pemanggilnya melihat perubahan itu. (Meng-assign object baru ke parameter di dalam method tidak memengaruhi variabel milik pemanggil; untuk itu dibutuhkan ref.)
  • == pada dua instance class secara default membandingkan reference: "apakah ini object yang sama?", bukan "apakah nilainya sama?". lookalike punya data yang identik, tetapi tetap object yang berbeda.

Kalau kamu ingin assignment menghasilkan salinan dan perbandingan berdasarkan nilai, lihat struct, yang merupakan tipe value, atau record, yang dibandingkan berdasarkan nilai.

null dan NullReferenceException

Variabel reference bisa berisi null, yang artinya "tidak ada object". Memakai member lewat null melempar NullReferenceException, exception saat runtime yang paling umum di kode C#.

Output:

True
no city on file
NullReferenceException: Address was never set
Lisbon

Solusinya hampir tidak pernah dengan menangkap exception itu. Cari tahu kenapa reference-nya null, lalu buat object-nya lebih awal, cek sebelum dipakai, atau pakai operator null-conditional ?., yang berhenti dan menghasilkan null alih-alih melempar exception. ?? lalu menyediakan nilai cadangan. Kedua operator ini dibahas di nullable type.

Meng-override ToString

Setiap class mewarisi object, yang menyediakan ToString(). Versi warisan itu mengembalikan nama lengkap tipenya (termasuk namespace-nya, kalau ada), dan itu jarang sekali yang ingin kamu cetak. Override method itu:

Output:

Plain
Mug (8.50)
In cart: Mug (8.50)
Total line: Mug (8.50)

Console.WriteLine, string interpolation, dan + dengan string semuanya memanggil ToString() untukmu. Debugger juga menampilkannya, jadi override ini tetap berguna meskipun kamu tidak pernah mencetak object-nya sendiri.

Object initializer

Object initializer mengisi field dan property public tepat setelah object dibuat, di ekspresi yang sama. Bentuk ini lebih enak dibaca daripada deretan assignment dan cocok dipakai di dalam literal koleksi.

Output:

A12: 25 (0 extras)
A13: 40 (2 extras)

Ada dua detail di tiket kedua. Price = 40m menimpa nilai 25m dari field initializer, karena object initializer berjalan setelah object selesai dibuat. Extras = { "Parking", "Poster" } tidak memakai new: bentuk ini memanggil Add pada list yang sudah disimpan field-nya, bukan menggantinya.

Object initializer bukan constructor. Initializer hanya bisa mengisi member yang bisa diakses dari kode pemanggil, dan tidak bisa memastikan sebuah member benar-benar diisi. Saat object tidak valid tanpa nilai tertentu, wajibkan nilai itu di constructor.

Partial class

Keyword partial memecah satu class ke beberapa file. Compiler menggabungkan bagian-bagiannya menjadi satu class.

// Invoice.cs
public partial class Invoice
{
    public decimal Subtotal;
    public decimal Total() => Subtotal + Tax();
}

// Invoice.Tax.cs
public partial class Invoice
{
    private decimal Tax() => Subtotal * 0.2m;
}

Setiap bagian harus menulis partial, berada di namespace yang sama, dan di project yang sama. Penggunaan umumnya adalah kode yang dihasilkan otomatis: designer WinForms, source generator, dan sebagian ORM menulis satu bagian dan menyerahkan bagian lainnya kepadamu, jadi membuat ulang kode itu tidak pernah menimpa kodemu. Memecah class yang ditulis tangan ke beberapa file hanya supaya terlihat lebih pendek biasanya menyembunyikan class yang seharusnya menjadi dua class.

Kesalahan umum

  • Memakai object sebelum membuatnya. Field bertipe class bernilai null sampai kamu meng-assign new ... ke field itu. Akses member pertama akan melempar NullReferenceException.
  • Mengira assignment akan menyalin. var b = a; untuk class memberi nama kedua untuk object yang sama. Buat object baru dan salin nilainya saat kamu butuh object yang terpisah.
  • Membandingkan object dengan == dan mengira yang dibandingkan nilainya. Untuk class, operator ini membandingkan reference kecuali class itu meng-overload == (seperti string). Bandingkan field yang relevan, atau override Equals.
  • Mencetak object dan malah mendapat nama tipenya. Override ToString().
  • Mendeklarasikan semuanya public. Cara ini berfungsi di contoh kecil, tetapi membuat kode mana pun bisa membuat object berada di keadaan yang tidak valid, misalnya saldo negatif. Buat field tetap private dan ubah lewat method yang memeriksa aturannya.

Pertanyaan yang sering diajukan

Apa itu class di C#?

Class adalah tipe yang kamu definisikan sendiri: sekumpulan data (field dan property) dan perilaku (method) yang diberi nama. class Account { public decimal Balance; public void Deposit(decimal amount) { Balance += amount; } } mendeklarasikan sebuah class. Class adalah cetak biru; ia tidak melakukan apa pun sampai kamu membuat object darinya dengan new.

Apa bedanya class dan object di C#?

Class adalah definisinya, ditulis sekali di kode sumber. Object adalah satu instance dari class itu, dibuat saat program berjalan dengan new, dengan salinan sendiri dari setiap field instance. Memanggil new Account() dua kali menghasilkan dua object dari class yang sama dengan saldo yang terpisah.

Bagaimana cara membuat object di C#?

Pakai new diikuti nama class dan argumen constructor-nya: var account = new Account();. Kamu bisa mengisi field dan property public di ekspresi yang sama dengan object initializer: new Account { Owner = "Maya" }. Variabelnya menyimpan reference ke object baru itu, bukan object-nya sendiri.

Kenapa saya mendapat NullReferenceException di C#?

Kamu memakai sebuah member (.Name, .Length, pemanggilan method) lewat variabel yang berisi null, jadi tidak ada object yang bisa dikenai aksinya. Penyebab umumnya adalah field yang tidak pernah di-assign (field class dimulai sebagai null), pencarian yang mengembalikan null, atau method yang mengembalikan null saat gagal. Cek dengan if (x != null), pakai x?.Name, atau pastikan object-nya dibuat sebelum dipakai.

Bagaimana cara meng-override ToString di C#?

Deklarasikan public override string ToString() di class-mu dan kembalikan teks yang kamu inginkan, misalnya public override string ToString() => $"{Name} ({Price:F2})";. Tanpa itu, Console.WriteLine(obj) dan string interpolation mencetak nama class-nya, karena itulah yang dikembalikan object.ToString().

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai