Bidang (Panduan Pemrograman C#)

Bidang adalah variabel dari jenis apa pun yang dideklarasikan langsung di kelas atau struktur. Bidang adalah anggota dari jenis yang memuatnya.

Kelas atau struktur dapat memiliki bidang instans, bidang statis, atau keduanya. Bidang instans khusus untuk instans dari suatu jenis. Jika Anda memiliki kelas T, dengan bidang Finstans , Anda dapat membuat dua objek jenis T, dan memodifikasi nilai F di setiap objek tanpa memengaruhi nilai di objek lain. Sebaliknya, bidang statis menjadi milik jenis itu sendiri, dan dibagi di antara semua contoh jenis itu. Anda bisa mengakses bidang statis hanya dengan menggunakan nama tipe. Jika Anda mengakses bidang statis dengan nama instans, Anda mendapatkan kesalahan waktu kompilasi CS0176.

Umumnya, Anda harus mendeklarasikan private atau protected mengakses bidang. Data yang diekspos jenis Anda ke kode klien harus disediakan melalui metode, properti, dan pengindeks. Dengan menggunakan konstruksi ini untuk akses tidak langsung ke bidang internal, Anda dapat menjaga terhadap nilai input yang tidak valid. Bidang privat yang menyimpan data yang diekspos oleh properti publik disebut backing store atau backing field. Anda dapat mendeklarasikan public bidang, tetapi kemudian Anda tidak dapat mencegah kode yang menggunakan jenis Anda dari pengaturan bidang tersebut ke nilai yang tidak valid atau mengubah data objek.

Bidang biasanya menyimpan data yang harus bisa diakses oleh lebih dari satu jenis metode dan harus disimpan lebih lama dari masa pakai metode tunggal apa pun. Misalnya, tipe yang mewakili tanggal kalender bisa memiliki tiga bidang integer: satu untuk bulan, satu untuk hari itu, dan satu untuk tahun ini. Variabel yang tidak digunakan di luar cakupan metode tunggal harus dideklarasikan sebagai variabel lokal dalam isi metode itu sendiri.

Bidang dideklarasikan dalam kelas atau blok struktur dengan menentukan tingkat akses, diikuti dengan jenis, diikuti dengan nama bidang. Contohnya:

public class CalendarEntry
{

    // private field (Located near wrapping "Date" property).
    private DateTime _date;

    // Public property exposes _date field safely.
    public DateTime Date
    {
        get
        {
            return _date;
        }
        set
        {
            // Set some reasonable boundaries for likely birth dates.
            if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
            {
                _date = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("Date");
            }
        }
    }

    // public field (Generally not recommended).
    public string? Day;

    // Public method also exposes _date field safely.
    // Example call: birthday.SetDate("1975, 6, 30");
    public void SetDate(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        // Set some reasonable boundaries for likely birth dates.
        if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)
        {
            _date = dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }

    public TimeSpan GetTimeSpan(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt.Ticks < _date.Ticks)
        {
            return _date - dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }
}

Untuk mengakses bidang dalam instans, tambahkan titik setelah nama instans, diikuti dengan nama bidang, seperti dalam instancename._fieldName. Contohnya:

CalendarEntry birthday = new CalendarEntry();
birthday.Day = "Saturday";

Bidang bisa diberikan nilai awal dengan menggunakan operator penugasan saat bidang dideklarasikan. Untuk menetapkan bidang Day secara otomatis ke "Monday", misalnya, Anda akan mendeklarasikan Day seperti dalam contoh berikut:

public class CalendarDateWithInitialization
{
    public string Day = "Monday";
    //...
}

Bidang diinsialisasi segera sebelum konstruktor untuk instans objek dipanggil. Jika konstruktor menetapkan nilai bidang, konstruktor akan menimpa nilai apa pun yang diberikan selama deklarasi bidang. Untuk informasi selengkapnya, lihat Menggunakan Konstruktor.

Catatan

Inisialisasi bidang tidak dapat merujuk ke bidang instans lain.

Bidang dapat ditandai sebagai public, , private, protected, internalprotected internal, atau private protected. Pengubah akses ini menentukan bagaimana pengguna jenis bisa mengakses bidang. Untuk informasi selengkapnya, lihat Pengubah Akses.

Bidang secara opsional dapat dideklarasikan static. Bidang statis tersedia untuk penelepon kapan saja, bahkan jika tidak ada instans jenis. Untuk informasi lebih lanjut, lihat Kelas Statik dan Anggota Kelas Statik.

Bidang dapat dideklarasikan readonly. Bidang baca-saja hanya bisa diberi nilai selama inisialisasi atau di konstruktor. static readonly Bidang mirip dengan konstanta, kecuali bahwa pengkompilasi C# tidak memiliki akses ke nilai bidang baca-saja statis pada waktu kompilasi, hanya pada waktu proses. Liihat Konstanta untuk informasi selengkapnya.

Bidang dapat dideklarasikan required. Bidang yang diperlukan harus diinisialisasi oleh konstruktor, atau oleh penginisialisasi objek saat objek dibuat. Anda menambahkan System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute atribut ke deklarasi konstruktor apa pun yang menginisialisasi semua anggota yang diperlukan.

Pengubah required tidak dapat dikombinasikan dengan pengubah readonly pada bidang yang sama. Namun, properti bisa required dan init hanya.

Dimulai dengan C# 12, Parameter konstruktor utama adalah alternatif untuk mendeklarasikan bidang. Saat jenis Anda memiliki dependensi yang harus disediakan saat inisialisasi, Anda dapat membuat konstruktor utama yang menyediakan dependensi tersebut. Parameter ini dapat diambil dan digunakan sebagai ganti bidang yang dideklarasikan dalam jenis Anda. Dalam kasus jenis record , parameter konstruktor utama muncul sebagai properti publik.

Spesifikasi bahasa C#

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

Lihat juga