Visibilitas default untuk kelas dan anggota C # (bidang, metode, dll.)?

164

Saya mencoba mencari referensi untuk visibilitas default dari berbagai aspek C #. Jenis kelas, bidang, metode, enum, dll.

Dapatkah seseorang memberikan daftar ini bersama dengan visibilitas default mereka (yaitu, tidak ada pengubah awalan)?

Ryan Peters
sumber
kemungkinan duplikat pengubah akses Default di C #
Jeff Sternal
8
Saya tidak akan menganggapnya sebagai duplikat ... pertanyaan itu spesifik (Apa default untuk INI?), Yang ini luas (Apa SEMUA default?)
WernerCD

Jawaban:

266

Semua informasi yang Anda cari dapat ditemukan di sini dan di sini (terima kasih Reed Copsey ):

Dari tautan pertama:

Kelas dan struct yang dideklarasikan secara langsung di dalam namespace (dengan kata lain, yang tidak bersarang di dalam kelas atau struct lainnya) dapat berupa publik atau internal. Internal adalah default jika tidak ada pengubah akses yang ditentukan .

...

Tingkat akses untuk anggota kelas dan anggota struct , termasuk kelas dan struct yang bersarang, bersifat pribadi secara default .

...

antarmuka standar untuk akses internal .

...

Delegasi berperilaku seperti kelas dan struct. Secara default, mereka memiliki akses internal ketika dideklarasikan secara langsung dalam namespace, dan akses pribadi saat bersarang .


Dari tautan kedua:

Tipe tingkat atas , yang tidak bersarang di tipe lain, hanya dapat memiliki aksesibilitas internal atau publik. The aksesibilitas default untuk jenis internal .

Dan untuk tipe bersarang:

Anggota aksesibilitas anggota Default
---------- ----------------------------
enum publik
kelas pribadi
antarmuka publik
struct pribadi
Oded
sumber
6
Kompilasi yang bagus dari info Reed, tetapi Anda lupa menentukan bahwa pengubah akses seperti itu juga berlaku untuk metode.
Joel
4
@ Joel Apa maksudmu? Dia jelas menyatakan "anggota". Anggota menjadi data dan perilaku dan dengan demikian termasuk metode.
rism
Jika ada pengembang vb.net melihat ini, vb berbeda. Cakupan default untuk anggota kelas vb adalah Public. Enumanggota juga Public. Mungkin kurang membingungkan untuk hanya menggunakan ruang lingkup eksplisit dalam kasus Anda karena kemungkinan tinggi akan diterjemahkan atau dibaca oleh pengembang c # di beberapa titik. Sayangnya, pembuatan kode di vb.net tidak melakukan ini untuk Anda.
toddmo
Saya akan menambahkan bahwa antarmuka bersarang dalam kelas bersifat pribadi, bukan internal, secara default.
Frank Bryce
13

Dari MSDN:

Tipe tingkat atas , yang tidak bersarang di tipe lain, hanya dapat memiliki internalatau publicaksesibilitas. Aksesibilitas default untuk jenis ini adalah internal.


Tipe bersarang , yang merupakan anggota dari tipe lain, dapat menyatakan aksesibilitas seperti yang ditunjukkan pada tabel berikut.

Aksesibilitas Anggota Nested Standar & Pengubah Aksesibilitas yang Diizinkan

Sumber: Tingkat aksesibilitas (C # Referensi) (6 Desember th 2017)

Nicholas Miller
sumber
9

Secara default, pengubah akses untuk kelas adalah internal. Itu berarti mengatakan, kelas dapat diakses dalam majelis yang sama. Tetapi jika kita ingin kelas diakses dari majelis lain maka itu harus dipublikasikan.

mrk
sumber
19
Informasi ini sudah ada di jawaban lain. Anda seharusnya hanya menjawab pertanyaan, terutama yang lama seperti ini, ketika Anda memiliki informasi tambahan untuk diberikan atau Anda berpikir bahwa jawaban yang lain salah. Bagaimanapun, selamat datang di Stack Overflow.
Gorpik
Kelas tidak harus dibuat publik agar dapat diakses oleh majelis lain. Seseorang dapat menggunakan Kelas InternalsVisibleToAttribute[assembly:InternalsVisibleTo("Friend1b")]
adam
0

Secara default adalah private. Kecuali mereka bersarang, kelasnya internal.

Svisstack
sumber
1
bukan enum publik secara default?
Ryan Peters
4
@ Jay: Kecuali mereka bersarang. @Ryan: Tidak, enum yang tidak bersarang adalah internal secara default.
Jon Skeet
2
@Ryan: Anggota Enum bersifat publik secara default, tetapi enum itu sendiri internal.
Reed Copsey
@ReedCopsey Tapi buku yang saya pelajari dengan jelas mengatakan itu enum members are private by default, so to use them outside the enum we should declare them as public. Bisakah Anda jelaskan mengapa buku itu bertentangan dengan apa yang Anda katakan? Terima kasih.
Buku apa pun yang dibaca @ user5794376 (jelas-jelas akun yang dihapus) harus diberikan semua ulasan 1 bintang jika apa yang mereka katakan dalam buku itu benar. Hanya perlu melihat Microsoft Documents untuk mengetahui bahwa anggota enum adalah publik secara default dan itulah mengapa itu adalah praktik umum untuk enums hanya untuk tidak eksplisit pada mereka.
Rodney S. Foley