Apa pengubah akses default untuk kelas, metode, anggota, konstruktor, delegasi, dan antarmuka?
sumber
Apa pengubah akses default untuk kelas, metode, anggota, konstruktor, delegasi, dan antarmuka?
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 mengaksesM
dengana.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 )
Jenis dan aksesibilitas anggota bersarang
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 ...)
sumber
Lihat Access Modifiers (Panduan Pemrograman C #)
sumber
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.
sumber
Saya ingin menambahkan beberapa tautan dokumentasi. Lihat lebih detail di sini .
sumber
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.
sumber
Internal adalah pengubah standar
sumber
Tingkat ruang nama:
internal
Tingkat jenis:
private
sumber