Apa pengubah akses default di C #?

384

Apa pengubah akses default untuk kelas, metode, anggota, konstruktor, delegasi, dan antarmuka?

Surya sasidhar
sumber

Jawaban:

486

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.)

Jon Skeet
sumber
154
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!
John Buchanan
sumber
13
Ini tidak menjelaskan bahwa jika sebuah kelas juga anggota (karena menjadi tipe bersarang) maka defaultnya adalah pribadi. Juga, anggota antarmuka dan enum selalu publik.
Jon Skeet
1
@ ny Tidak, ini bukan pribadi. Itu milik umum. Hanya saja tidak mendapatkan slot dalam jenis menerapkan, jadi jika class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();, Anda tidak dapat mengakses Mdengan a.M(), namun Anda dapat mengaksesnya dengan (a as IFoo).M(). (Periksa spesifikasi untuk info lebih lanjut tentang spesifikasi)
M.Stramm
130

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 ...)

Ben Aston
sumber
12

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.

Adriaan Stander
sumber
8

Kelas adalah Internal secara default.

  • Anggota kelas bersifat pribadi 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.

  • Anggota Struct bersifat pribadi secara default.
Kamala Hanchinal
sumber
5

Saya ingin menambahkan beberapa tautan dokumentasi. Lihat lebih detail di sini .

masukkan deskripsi gambar di sini

Asif Mushtaq
sumber
1
kelas secara default internal dan bukan pribadi.
Baahubali
1
Di mana saya menulis kelas adalah privat?
Asif Mushtaq
Tabel ini hanya valid untuk tipe bersarang.
BlueSilver
kelas adalah internal secara default dan kelas di dalam namespace tidak dapat pribadi. tetapi kelas di dalam kelas (kelas bersarang) dapat bersifat pribadi
Arun
Pengubah akses antarmuka adalah Internal secara default.
Kamala Hanchinal
4

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.

Stokely
sumber
1

Internal adalah pengubah standar

renjucool
sumber
0

Tingkat ruang nama: internal

Tingkat jenis: private

leppie
sumber