Apa pengubah akses default untuk kelas, metode, anggota, konstruktor, delegasi, dan antarmuka?
Apa pengubah akses default untuk kelas, metode, anggota, konstruktor, delegasi, dan antarmuka?
Jawaban:
Akses default untuk semua yang ada di C # adalah "akses paling dibatasi yang dapat Anda nyatakan untuk anggota itu" .
Jadi misalnya:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
setara dengan
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
Satu-satunya pengecualian untuk ini adalah membuat satu bagian dari properti (biasanya setter) lebih terbatas daripada aksesibilitas yang dinyatakan properti itu sendiri:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
Inilah yang dikatakan spesifikasi C # 3.0 (bagian 3.5.1):
Bergantung pada konteks di mana deklarasi anggota berlangsung, hanya jenis aksesibilitas yang dinyatakan diizinkan. Lebih jauh, ketika deklarasi anggota tidak menyertakan pengubah akses, konteks di mana deklarasi tersebut menentukan aksesibilitas yang dinyatakan standar.
- Ruang nama secara implisit memiliki aksesibilitas yang dinyatakan publik. Tidak ada pengubah akses yang diizinkan pada deklarasi namespace.
- Jenis yang dideklarasikan dalam unit kompilasi atau ruang nama dapat memiliki aksesibilitas yang dideklarasikan secara publik atau internal dan standar untuk aksesibilitas yang dinyatakan secara internal.
- Anggota kelas dapat memiliki salah satu dari lima jenis aksesibilitas yang dideklarasikan dan standar untuk aksesibilitas yang dinyatakan pribadi. (Perhatikan bahwa tipe yang dideklarasikan sebagai anggota kelas dapat memiliki salah satu dari lima jenis aksesibilitas yang dideklarasikan, sedangkan tipe yang dideklarasikan sebagai anggota namespace hanya dapat memiliki aksesibilitas yang dideklarasikan secara publik atau internal.)
- Anggota Struct dapat memiliki aksesibilitas yang dideklarasikan secara publik, internal, atau pribadi dan default ke aksesibilitas yang dideklarasikan pribadi karena struct secara implisit disegel. Anggota Struct yang diperkenalkan dalam sebuah struct (yaitu, tidak diwarisi oleh struct itu) tidak dapat memiliki aksesibilitas internal yang dilindungi atau dilindungi. (Perhatikan bahwa tipe yang dideklarasikan sebagai anggota struct dapat memiliki aksesibilitas yang dideklarasikan secara publik, internal, atau pribadi, sedangkan tipe yang dideklarasikan sebagai anggota namespace hanya dapat memiliki aksesibilitas publik atau internal yang dinyatakan.)
- Anggota antarmuka secara implisit memiliki aksesibilitas yang dinyatakan publik. Pengubah akses tidak diizinkan pada deklarasi anggota antarmuka.
- Anggota pencacahan secara implisit memiliki aksesibilitas yang dinyatakan publik. Tidak ada pengubah akses yang diizinkan pada deklarasi anggota enumerasi.
(Perhatikan bahwa tipe bersarang akan berada di bawah bagian "anggota kelas" atau "anggota struktural" - dan karenanya default ke visibilitas pribadi.)
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!
class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();
, Anda tidak dapat mengakses M
dengan a.M()
, namun Anda dapat mengaksesnya dengan (a as IFoo).M()
. (Periksa spesifikasi untuk info lebih lanjut tentang spesifikasi)
Jawaban singkat: akses minimum yang mungkin (lihat jawaban Jon Skeet).
Jawaban panjang:
Jenis non-bersarang , enumerasi dan aksesibilitas delegasi ( hanya dapat memiliki aksesibilitas internal atau publik )
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | none (always implicitly public) interface | internal | public, internal class | internal | public, internal struct | internal | public, internal delegate | internal | public, internal
Jenis dan aksesibilitas anggota bersarang
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | none (always implicitly public) interface | public | none class | private | All¹ struct | private | public, internal, private² delegate | private | All¹ constructor | private | All¹ interface member | public | none (always implicitly public) method | private | All¹ field | private | All¹ user-defined operator| none | public (must be declared public)
¹ Semua === publik, dilindungi, internal, pribadi, internal terlindungi
² struct tidak dapat diwarisi dari struct atau kelas (meskipun mereka dapat, antarmuka), maka dilindungi bukan pengubah yang valid
Aksesibilitas dari tipe bersarang tergantung pada domain aksesibilitasnya, yang ditentukan oleh aksesibilitas yang dideklarasikan dari anggota dan domain aksesibilitas dari tipe yang langsung mengandung. Namun, domain aksesibilitas dari tipe bersarang tidak dapat melebihi domain tipe yang mengandung.
Catatan: CIL juga memiliki ketentuan untuk terproteksi dan internal (tidak seperti yang dilindungi "atau" internal), tetapi setahu saya ini saat ini tidak tersedia untuk digunakan dalam C #.
Lihat:
http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en- us / library / cx03xt0t.aspx
(Man I love Microsoft URIs ...)
Lihat Access Modifiers (Panduan Pemrograman C #)
Aksesibilitas Kelas dan Struktur
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.
Anggota Struct, termasuk kelas dan struct bersarang, dapat dinyatakan sebagai publik, internal, atau pribadi. Anggota kelas, termasuk kelas dan struktur bersarang, dapat bersifat publik, dilindungi internal, dilindungi, internal, dilindungi pribadi atau pribadi. Tingkat akses untuk anggota kelas dan anggota struct, termasuk kelas dan struct yang bersarang, bersifat pribadi secara default. Jenis bersarang pribadi tidak dapat diakses dari luar jenis yang mengandung.
Kelas turunan tidak dapat memiliki aksesibilitas yang lebih besar daripada tipe dasarnya. Dengan kata lain, Anda tidak dapat memiliki kelas publik B yang berasal dari kelas internal A. Jika ini diizinkan, itu akan memiliki efek membuat publik, karena semua anggota internal A yang terlindungi atau internal dapat diakses dari kelas turunan.
Anda dapat mengaktifkan rakitan khusus lainnya untuk mengakses tipe internal Anda dengan menggunakan
InternalsVisibleToAttribute
. Untuk informasi lebih lanjut, lihat Sidang Teman.Aksesibilitas Anggota Kelas dan Struktur
Anggota kelas (termasuk kelas bersarang dan struct) dapat dideklarasikan dengan salah satu dari enam jenis akses. Anggota Struct tidak dapat dinyatakan sebagai terlindungi karena struct tidak mendukung warisan.
Biasanya, aksesibilitas anggota tidak lebih besar dari aksesibilitas tipe yang mengandungnya. Namun, anggota publik dari kelas internal mungkin dapat diakses dari luar majelis jika anggota mengimplementasikan metode antarmuka atau mengganti metode virtual yang didefinisikan dalam kelas basis publik.
Jenis setiap anggota yang merupakan bidang, properti, atau acara harus setidaknya dapat diakses seperti anggota itu sendiri. Demikian pula, tipe pengembalian dan tipe parameter dari setiap anggota yang merupakan metode, pengindeks, atau delegasi harus setidaknya dapat diakses sebagai anggota itu sendiri. Misalnya, Anda tidak dapat memiliki metode publik M yang mengembalikan kelas C kecuali C juga publik. Demikian juga, Anda tidak dapat memiliki properti yang dilindungi tipe A jika A dinyatakan sebagai pribadi.
Operator yang ditentukan pengguna harus selalu dinyatakan publik dan statis. Untuk informasi lebih lanjut, lihat Kelebihan operator.
Finalizers tidak dapat memiliki pengubah aksesibilitas.
Tipe yang lain
Antarmuka yang dideklarasikan secara langsung di dalam namespace dapat dideklarasikan sebagai publik atau internal dan, seperti halnya kelas dan struct, antarmuka standar untuk akses internal. Anggota antarmuka selalu bersifat publik karena tujuan antarmuka adalah untuk memungkinkan tipe lain mengakses kelas atau struct. Tidak ada pengubah akses yang dapat diterapkan pada anggota antarmuka.
Anggota enumerasi selalu bersifat publik, dan tidak ada pengubah akses yang dapat diterapkan.
Delegasi berperilaku seperti kelas dan struct. Secara default, mereka memiliki akses internal ketika dideklarasikan secara langsung dalam namespace, dan akses pribadi saat bersarang.
Kelas adalah Internal secara default.
Antarmuka internal secara default.
Anggota antarmuka bersifat publik secara default. (Antarmuka tidak akan memungkinkan kami menentukan jenis aksesibilitas apa pun kepada anggota itu.)
Catatan: Jika Anda mencoba menentukan specifier akses apa pun untuk anggota antarmuka, itu menunjukkan kesalahan kompilasi.
Struct adalah Internal secara default.
Saya ingin menambahkan beberapa tautan dokumentasi. Lihat lebih detail di sini .
Jawaban paling sederhana adalah sebagai berikut .....
Semua anggota di C # selalu menggunakan pengubah LEAST yang dapat diakses secara default.
Itulah sebabnya semua kelas tingkat atas dalam suatu majelis bersifat "internal" secara default, yang berarti mereka terbuka untuk umum di tempat mereka berkumpul, tetapi bersifat pribadi atau dikecualikan dari akses ke majelis luar. Satu-satunya pilihan lain untuk kelas tingkat atas adalah publik yang lebih mudah diakses. Untuk tipe bersarang semuanya pribadi kecuali beberapa pengecualian langka seperti anggota enum dan antarmuka yang hanya dapat publik. Beberapa contoh. Dalam hal kelas dan antarmuka tingkat atas, standarnya adalah:
Hewan kelas sama dengan Hewan kelas internal
Hewan antarmuka sama dengan hewan antarmuka publik
Dalam hal kelas dan antarmuka bersarang (tipe di dalam), standarnya adalah:
Hewan kelas sama dengan Hewan kelas privat
Hewan antarmuka sama dengan Hewan antarmuka pribadi
Jika Anda hanya menganggap default selalu yang paling pribadi, maka Anda tidak perlu menggunakan accessor sampai Anda perlu mengubah default. Mudah.