internal vs publik di c #

92

Saya ingin tahu perbedaan antara pengubah visibilitas publicdan internal.

Kapan sebaiknya kami gunakan internaldi kelas dan kapan public? Saya bingung dengan kapan suatu metode harus publicatau internal.

Saya membaca bahwa internaldapat diakses melalui Majelis, sementara publicdapat juga digunakan melalui perakitan di mana perbedaannya.

NoviceToDotNet
sumber

Jawaban:

101

public terlihat dari mana saja.

internal hanya terlihat di dalam majelis

Anda cenderung menggunakan hanya internal untuk melindungi API internal. Misalnya, Anda dapat mengekspos beberapa kelebihan metode:

public int Add(int x, int y)
public int Add(int x,int y, int z)

Keduanya memanggil metode internal

internal int Add(int[] numbers)

Anda kemudian dapat menambahkan banyak kecanggihan pada suatu metode, tetapi "melindunginya" menggunakan metode fasad yang dapat membantu pemrogram untuk memanggil metode tersebut dengan benar. (Metode implementasi dengan parameter array mungkin memiliki batas nilai yang berubah-ubah, misalnya.)

Juga perlu dicatat bahwa menggunakan Refleksi, setiap dan semua metode dapat dipanggil terlepas dari visibilitasnya. "Retasan" lainnya untuk mengontrol / mendapatkan akses ke API yang tersembunyi secara internal.

Program.X
sumber
5
di kelas internal dapatkah saya mendeklarasikan metode publik ..?
NoviceToDotNet
Tidak, karena ini akan menimbulkan konflik. Kompiler akan memberitahu Anda tentang ini dan gagal untuk mengkompilasi.
Program.X
14
@ Program.X: Sebenarnya, Anda bisa dan kompilator tidak memberi tahu Anda apa pun.
ATAU Mapper
Sebenarnya saya datang ke sini googling apakah ini benar-benar sebuah fitur atau tidak. Bayangkan membuat kelas internaldan semua metode public. Jika Anda membutuhkan visibilitas yang lebih tinggi, Anda dapat menyetel kembali seluruh kelas public. Tapi saya tidak yakin, apakah itu dimaksudkan untuk digunakan seperti ini atau tidak. Jadi saya terus googling ... edit Et voilà, topik yang sama: stackoverflow.com/questions/9302236/…
ecth
31

internalberguna ketika Anda ingin mendeklarasikan anggota atau tipe di dalam DLL, bukan di luar itu ...
biasanya, ketika Anda mendeklarasikan anggota sebagai PublicAnda dapat mengaksesnya dari DLL lain. tetapi, jika Anda perlu mendeklarasikan sesuatu menjadi publik tepat di dalam perpustakaan kelas Anda, Anda dapat mendeklarasikannya sebagai Internal.
dalam definisi formal: anggota internal hanya terlihat di dalam majelis saat ini ...

Dr TJ
sumber
11

internaljuga berguna saat menulis tes unit. The InternalsVisibleToatribut mari kita uji Anda akses perakitan metode internal dalam kode Anda perakitan. Yaitu Anda dapat menguji metode yang tampak pribadi bagi dunia luar tanpa menggunakan refleksi.

Brian Rasmussen
sumber
6

Publik juga bisa diakses di luar majelis. Jadi, ketika Anda memiliki kelas yang seharusnya tidak dapat diakses, setiap kelas di assembly harus dapat mengaksesnya, maka internal adalah hal yang benar. Jika Anda membutuhkan akses luar, gunakan publik.

Tomas Jansson
sumber
4

Juga, properti yang ditandai sebagai internalakan menampilkan BindingExpression path errorif digunakan untuk DataBinding di WPF. Jadi itu harus publicagar berfungsi dengan benar, bahkan ketika DataBinding berlangsung dalam rakitan yang sama.

M463
sumber
1

Secara umum, publicmetode harus memenuhi standar yang sangat tinggi untuk ketahanan (tidak merusak atau merusak data karena masukan yang buruk) dan kesadaran keamanan (tidak mengizinkan masukan tak terduga untuk memicu eksploitasi). Tetapi untuk internal,, protecteddan privatemetode, sering kali masuk akal untuk mengikuti standar yang lebih santai, karena seseorang memiliki kendali penuh atas masukan apa yang dapat diterima setiap metode.

Karena parameter yang diteruskan ke publicmetode (mungkin dari sumber eksternal) dianggap kurang dapat dipercaya daripada parameter yang diterima dari dalam rakitannya sendiri, metode yang ditandai publicsering diperlakukan berbeda oleh penganalisis kode daripada metode identik yang ditandai sebagai internal. Sebagai contoh, dengan publicmetode penganalisis dapat memperingatkan Anda untuk memeriksa bahwa parameter metode tidak null. Dengan internalmetode, dimungkinkan untuk mengkonfigurasi penganalisis agar tidak terlalu ketat dalam nullpemeriksaan. Atau penganalisis mungkin dapat menentukan sendiri, dengan melakukan analisis aliran dari semua file sumber untuk perakitan, itunulltidak akan pernah diteruskan ke metode tertentu sebagai argumen, dan dengan demikian menentukan tidak perlu memeriksa apakah parameternya ada null. Ada banyak contoh lain dari penganalisis yang memperlakukan publicdan internalmetode secara berbeda.

Dengan menandai kelas, metode, properti, bidang, antarmuka, dll dengan benar dengan pengubah akses yang benar, Anda memberi sinyal yang benar ke penganalisis kode maksud Anda, dan sebagai gantinya penganalisis dapat memberikan pesan peringatan dan saran yang lebih relevan.

Wayne VanWeerthuizen
sumber
-3

Jika Anda dapat mereferensikan assemble dari luar, Anda memiliki lingkup kelas Internal dan publik

Leroy.P
sumber