Bagikan melalui


Pengubah Akses (Panduan Pemrograman C#)

Semua jenis dan anggota jenis memiliki tingkat aksesibilitas. Tingkat aksesibilitas mengontrol apakah mereka bisa digunakan dari kode lain di perakitan Anda atau rakitan lainnya. Rakitan adalah .dll atau .exe yang dibuat dengan menyusun satu atau lebih file .cs dalam satu kompilasi. Gunakan pengubah akses berikut untuk menentukan aksesibilitas jenis atau anggota ketika Anda mendeklarasikannya:

  • publik: Kode dalam rakitan apa pun dapat mengakses jenis atau anggota ini. Tingkat aksesibilitas jenis yang berisi mengontrol tingkat aksesibilitas anggota publik jenis tersebut.
  • privat: Hanya kode yang dideklarasikan dalam hal yang sama class atau struct dapat mengakses anggota ini.
  • dilindungi: Hanya kode dalam yang sama class atau turunan class yang dapat mengakses jenis atau anggota ini.
  • internal: Hanya kode dalam rakitan yang sama yang dapat mengakses jenis atau anggota ini.
  • internal yang dilindungi: Hanya kode dalam rakitan yang sama atau di kelas turunan di rakitan lain yang dapat mengakses jenis atau anggota ini.
  • dilindungi privat: Hanya kode dalam rakitan yang sama dan di kelas yang sama atau kelas turunan yang dapat mengakses jenis atau anggota.
  • file: Hanya kode dalam file yang sama yang dapat mengakses jenis atau anggota.

Pengubah record pada jenis menyebabkan pengkompilasi mensintesis anggota tambahan. Pengubah record tidak memengaruhi aksesibilitas default untuk record class atau record struct.

Tabel ringkasan

Lokasi pemanggil public protected internal protected internal private protected private file
Dalam file ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Di dalam kelas ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
Kelas turunan (rakitan yang sama) ✔️ ✔️ ✔️ ✔️ ✔️
Kelas nonturunan (perakitan yang sama) ✔️ ✔️ ✔️
Kelas turunan (perakitan berbeda) ✔️ ✔️ ✔️
Kelas nonturunan (perakitan berbeda) ✔️

Contoh berikut ini menunjukkan cara menentukan pengubah akses pada jenis dan anggota:

public class Bicycle
{
    public void Pedal() { }
}

Tidak semua pengubah akses berlaku untuk semua jenis atau anggota pada semua konteks. Dalam beberapa kasus, aksesibilitas jenis yang berisi membatasi aksesibilitas anggotanya.

Ketika satu deklarasi kelas parsial atau metode parsial tidak mendeklarasikan aksesibilitasnya, ia memiliki aksesibilitas deklarasi lainnya. Kompilator menghasilkan kesalahan jika beberapa deklarasi untuk kelas atau metode parsial menyatakan aksesibilitas yang berbeda.

Aksesibilitas kelas dan struktur

Kelas dan struktur yang dideklarasikan langsung dalam namespace (tidak ditumpuk dalam kelas atau struktur lain) dapat berupa public atau internal. internal adalah defaultnya jika tidak ada pengubah akses yang ditentukan.

Anggota struktur, termasuk kelas dan struktur berlapis, dapat dideklarasikan sebagai public, internal, atau private. Anggota kelas, termasuk kelas dan struktur berlapis, dapat berupa public, protected internal, protected, internal, private protected, atau private. Anggota kelas dan struktur, termasuk kelas dan struktur berlapis, memiliki akses private secara default.

Kelas turunan tidak dapat memiliki aksesibilitas yang lebih besar daripada jenis dasarnya. Anda tidak bisa mendeklarasikan kelas publik B yang berasal dari kelas internal A. Jika diizinkan, itu akan memiliki efek membuat A menjadi publik, karena semua anggota protected atau internal dari A dapat diakses dari kelas turunan.

Anda bisa mengaktifkan rakitan lain tertentu untuk mengakses jenis internal Anda dengan menggunakan InternalsVisibleToAttribute. Untuk informasi selengkapnya, lihat Rakitan Teman.

Jenis lain

Antarmuka yang dideklarasikan langsung dalam namespace dapat berupa public atau internal dan, sama seperti kelas dan struktur, antarmuka default untuk akses internal. Anggota antarmuka memiliki sifat public secara default karena tujuan antarmuka adalah untuk mengaktifkan jenis lain untuk mengakses kelas atau struktur. Deklarasi anggota antarmuka mungkin menyertakan pengubah akses apa pun. Anda menggunakan pengubah akses pada interface anggota untuk memberikan implementasi umum yang diperlukan oleh semua implementator antarmuka.

Jenis delegate yang dideklarasikan langsung dalam namespace memiliki internal akses secara default.

Untuk informasi selengkapnya tentang pengubah akses, lihat halaman Tingkat Aksesibilitas.

Aksesibilitas anggota

Anggota class atau struct (termasuk kelas dan struktur berlapis) dapat dideklarasikan dengan salah satu dari enam jenis akses. Anggota struktur tidak dapat dinyatakan sebagai protected, protected internal, atau private protected karena struktur tidak mendukung pewarisan.

Biasanya, aksesibilitas anggota tidak lebih besar dari aksesibilitas jenis yang memuatnya. Namun, public anggota internal kelas mungkin dapat diakses dari luar rakitan jika anggota menerapkan metode antarmuka atau mengambil alih metode virtual yang ditentukan dalam kelas dasar publik.

Jenis bidang anggota, properti, atau peristiwa setidaknya harus dapat diakses sebagai anggota itu sendiri. Demikian juga, jenis pengembalian dan jenis parameter dari metode, pengindeks, atau delegasi apa pun setidaknya harus dapat diakses seperti anggota itu sendiri. Contohnya, Anda tidak dapat memiliki public metode M yang mengembalikan kelas C kecuali C juga public. Demikian juga, Anda tidak bisa memiliki properti protected jenis A jika A dinyatakan sebagai private.

Operator yang ditentukan pengguna harus selalu dinyatakan sebagai public dan static. Untuk informasi selengkapnya, lihat Operator yang membebani.

Untuk mengatur tingkat akses untuk anggota class atau struct , tambahkan kata kunci yang sesuai ke deklarasi anggota, seperti yang ditunjukkan dalam contoh berikut.

// public class:
public class Tricycle
{
    // protected method:
    protected void Pedal() { }

    // private field:
    private int _wheels = 3;

    // protected internal property:
    protected internal int Wheels
    {
        get { return _wheels; }
    }
}

Finalizer tidak dapat memiliki pengubah aksesibilitas. Anggota jenis enum selalu public, dan tidak ada pengubah akses yang dapat diterapkan.

Pengubah file akses hanya diperbolehkan pada deklarasi jenis tingkat atas (tidak berlapis).

Spesifikasi bahasa C#

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

Lihat juga