Bagikan melalui


Bidang (Panduan Pemrograman C#)

Field adalah variabel dari jenis apa pun yang dideklarasikan langsung di class atau struct. Bidang adalah anggota dari tipe yang mengandungnya.

Kelas atau struktur mungkin memiliki bidang instans, bidang statis, atau keduanya. Bidang instance berkaitan khusus dengan instance dari sebuah tipe. 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 milik jenis itu sendiri, dan dibagikan di antara semua instans jenis tersebut. Anda hanya dapat mengakses bidang statis dengan menggunakan nama jenis. Jika Anda mengakses bidang statis dengan nama instans, Anda mendapatkan kesalahan waktu kompilasi CS0176 .

Umumnya, Anda harus mendeklarasikan private atau protected aksesibilitas untuk bidang. Data yang diekspos oleh tipe Anda ke kode klien harus disediakan melalui metode, properti, dan pengindeks. Dengan menggunakan konstruksi ini untuk akses tidak langsung ke bidang internal, Anda dapat melindungi dari nilai input yang tidak valid. Bidang privat yang menyimpan data yang diekspos oleh properti publik disebut penyimpanan cadangan atau field cadangan. 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 dapat diakses oleh lebih dari satu metode jenis dan harus disimpan lebih lama dari masa pakai metode tunggal apa pun. Misalnya, jenis yang mewakili tanggal kalender mungkin memiliki tiga bidang bilangan bulat: satu untuk bulan, satu untuk hari itu, dan satu untuk tahun tersebut. 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 dapat diberikan nilai awal dengan menggunakan operator penugasan saat bidang dideklarasikan. Untuk menetapkan Day bidang secara otomatis ke "Monday", misalnya, Anda akan mendeklarasikan Day seperti dalam contoh berikut:

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

Bidang diinisialisasi segera sebelum konstruktor untuk instans objek dipanggil. Jika konstruktor menetapkan nilai untuk suatu bidang, maka akan menimpa nilai apa pun yang diberikan selama deklarasi bidang. Untuk informasi lebih lanjut, lihat Menggunakan Konstruktor.

Nota

Penginisialisasi variabel tidak dapat merujuk ke variabel instans lain.

Bidang dapat ditandai sebagai public, , private, protected, internalprotected internal, atau private protected. Pengubah akses ini menentukan bagaimana pengguna tipe dapat 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 instance dari tipe tersebut. Untuk informasi lebih lanjut, lihat Kelas Statik dan Anggota Kelas Statik.

Bidang dapat dideklarasikan readonly. Bidang baca-saja hanya dapat ditetapkan nilai selama inisialisasi atau dalam 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. Untuk informasi selengkapnya, lihat Konstanta.

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 hanya bisa required dan init.

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