Kelas C#

Petunjuk / Saran

Baru mengembangkan perangkat lunak? Mulai dengan tutorial Memulai terlebih dahulu. Anda akan menemukan kelas ketika Anda perlu memodelkan objek dengan perilaku dan status.

Berpengalaman dalam bahasa lain? Kelas C# mirip dengan kelas di Java atau C++. Baca sekilas bagian penginisialisasi objek untuk pola C#-spesifik, dan lihat Record untuk alternatif yang berfokus pada data.

Kelas adalah jenis referensi yang menentukan cetak biru untuk objek. Saat Anda membuat variabel jenis kelas, variabel menyimpan referensi ke objek pada tumpukan terkelola. Variabel tidak menyimpan data objek itu sendiri. Menetapkan variabel kelas ke variabel lain menyalin referensi, sehingga kedua variabel menunjuk ke objek yang sama. Kelas adalah cara paling umum untuk menentukan jenis kustom di C#. Gunakan saat Anda memerlukan perilaku kompleks, pewarisan, atau identitas bersama di antara referensi.

Kapan menggunakan kelas

Gunakan kelas saat:

  • Jenis ini memiliki perilaku kompleks atau mengelola status yang dapat diubah.
  • Anda memerlukan warisan untuk membuat kelas dasar dengan spesialisasi turunan, atau untuk membuat jenis turunan yang memperluas kelas yang ada.
  • Instans mewakili identitas bersama, bukan objek yang kebetulan memiliki nilai yang sama. Dua referensi ke objek yang sama harus tetap sinkron.
  • Jenisnya besar atau berumur panjang dan mendapat manfaat dari alokasi timbunan dan semantik referensi.

Mendeklarasikan kelas

Tentukan kelas dengan class kata kunci diikuti dengan nama jenis. Pengubah akses opsional mengontrol visibilitas. Defaultnya adalah internal. Tentukan public untuk mengizinkan pemanggil dari assembly lain menggunakan tipe Anda.

public class Customer
{
    public string Name { get; set; }

    public Customer(string name) => Name = name;
}

Isi kelas berisi bidang, properti, metode, dan peristiwa, yang secara kolektif disebut anggota kelas. Nama harus berupa nama pengidentifikasi C# yang valid.

Membuat objek

Kelas mendefinisikan jenis, tetapi bukan objek itu sendiri. Anda membuat objek ( instans kelas) dengan new kata kunci:

var customer = new Customer("Allison");
Console.WriteLine(customer.Name); // Allison

Variabel customer menyimpan referensi ke objek, bukan objek itu sendiri. Anda dapat menetapkan beberapa variabel ke objek yang sama. Perubahan melalui satu referensi terlihat melalui referensi lainnya:

var c1 = new Customer("Grace");
var c2 = c1; // both variables reference the same object

c2.Name = "Hopper";
Console.WriteLine(c1.Name); // Hopper — c1 sees the change made through c2

Perilaku berbagi referensi ini adalah salah satu perbedaan antara kelas dan struktur. Dengan struktur, penugasan menyalin data. Yang lebih penting, kelas mendukung warisan. Anda dapat membangun hierarki di mana jenis turunan menggunakan kembali dan mengkhususkan perilaku dari kelas dasar. Struktur tidak dapat berpartisipasi dalam hierarki warisan. Untuk informasi selengkapnya tentang perbedaannya, lihat Jenis nilai dan jenis referensi.

Konstruktor dan inisialisasi

Saat membuat instans, Anda ingin bidang dan propertinya diinisialisasi dengan nilai yang berguna. C# menawarkan beberapa pendekatan: penginisialisasi bidang, parameter konstruktor, konstruktor utama, dan properti yang diperlukan.

Penginisialisasi bidang mengatur nilai default langsung pada deklarasi bidang:

public class Container
{
    private int _capacity = 10;
}

Inisialisasi bidang menetapkan nilai default yang wajar ke bidang atau properti. Ini membedakannya dari pendekatan berikut di mana penelepon dapat memberikan nilai awal.

Parameter konstruktor mengharuskan penelepon untuk memberikan nilai:

public class Container
{
    private int _capacity;

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

Konstruktor utama (C# 12+) menambahkan parameter langsung ke deklarasi kelas. Parameter tersebut tersedia di seluruh isi kelas:

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

Konstruktor utama dan penginisialisasi bidang dapat bekerja sama: penginisialisasi _capacity = capacity bidang menggunakan parameter konstruktor primer sebagai nilainya. Pola ini memungkinkan Anda menangkap argumen konstruktor di bidang dengan satu deklarasi ringkas.

Properti yang diperlukan memberlakukan bahwa penelepon mengatur properti tertentu melalui penginisialisasi objek:

public class Person
{
    public required string FirstName { get; set; }
    public required string LastName { get; set; }
}
// var missing = new Person(); // Error: required properties not set
var person = new Person { FirstName = "Grace", LastName = "Hopper" };
Console.WriteLine($"{person.FirstName} {person.LastName}"); // Grace Hopper

Untuk melihat lebih dalam pola konstruktor, termasuk validasi parameter dan penautan konstruktor, lihat Konstruktor.

Kelas statik

Kelas static tidak dapat diinstansiasi dan hanya berisi anggota statis. Gunakan kelas statis untuk mengatur metode utilitas yang tidak beroperasi pada data instans:

static class MathHelpers
{
    public static double CircleCircumference(double radius) =>
        2 * Math.PI * radius;
}
double circumference = MathHelpers.CircleCircumference(5.0);
Console.WriteLine($"Circumference: {circumference:F2}"); // Circumference: 31.42

Pustaka kelas .NET mencakup banyak kelas statis, seperti Math dan Console. Kelas statis disegel secara implisit. Anda tidak dapat memperolehnya atau membuat instansnya.

Penginisialisasi objek

Penginisialisasi objek memungkinkan Anda mengatur properti saat membuat objek, tanpa menulis konstruktor untuk setiap kombinasi nilai:

class ConnectionOptions
{
    public string Host { get; init; } = "localhost";
    public int Port { get; init; } = 80;
    public bool UseSsl { get; init; }
}
var options = new ConnectionOptions
{
    Host = "db.example.com",
    Port = 5432,
    UseSsl = true
};
Console.WriteLine($"{options.Host}:{options.Port} (SSL: {options.UseSsl})");
// db.example.com:5432 (SSL: True)

Penginisialisasi objek bekerja dengan properti apa pun yang dapat diakses yang memiliki set atau init aksesor. Mereka menggabungkan secara alami dengan required properti dan dengan konstruktor yang menerima beberapa parameter sambil membiarkan pemanggil mengatur yang lain.

Saat properti adalah koleksi, Anda dapat menggunakan ekspresi Koleksi (referensi C#) untuk menginisialisasi objek tersebut.

Pewarisan

Kelas mendukung pewarisan. Anda dapat menentukan kelas baru yang menggunakan kembali, memperluas, atau memodifikasi perilaku kelas yang ada. Kelas yang Anda warisi adalah kelas dasar, dan kelas baru adalah kelas turunan:

var manager = new Manager("Satya", "Engineering");
Console.WriteLine($"{manager.Name} manages {manager.Department}");
// Satya manages Engineering

Kelas dapat mewarisi dari satu kelas dasar dan mengimplementasikan beberapa antarmuka. Kelas turunan mewarisi semua anggota kelas dasar kecuali konstruktor. Untuk informasi selengkapnya, lihat Warisan dan Antarmuka.

Baca juga