Dapatkah seseorang tolong uraikan perbedaan antara pengubah 'terproteksi' dan 'terproteksi internal' di C #? Tampaknya mereka berperilaku dengan cara yang sama.
Dapatkah seseorang tolong uraikan perbedaan antara pengubah 'terproteksi' dan 'terproteksi internal' di C #? Tampaknya mereka berperilaku dengan cara yang sama.
Jawaban:
Pengubah akses "terproteksi internal" adalah gabungan dari pengubah "terproteksi" dan "internal".
Dari MSDN, Access Modifiers (Panduan Pemrograman C #) :
Tipe atau anggota dapat diakses hanya dengan kode di kelas atau struct yang sama, atau dalam kelas yang diturunkan dari kelas itu.
internal :
Jenis atau anggota dapat diakses oleh kode apa pun di rakitan yang sama, tetapi tidak dari rakitan lain.
internal yang dilindungi :
Jenis atau anggota dapat diakses oleh kode apa pun dalam majelis di mana ia dinyatakan, ATAU dari dalam kelas turunan di majelis lain. Akses dari majelis lain harus terjadi dalam deklarasi kelas yang berasal dari kelas di mana elemen internal yang dilindungi dinyatakan, dan itu harus terjadi melalui instance dari tipe kelas turunan.
Perhatikan bahwa : protected internal
berarti " protected
ATAU internal
" (kelas apa pun dalam rakitan yang sama, atau kelas turunan apa pun - bahkan jika berada dalam rakitan yang berbeda).
... dan untuk kelengkapan:
pribadi :
Jenis atau anggota hanya dapat diakses oleh kode di kelas atau struct yang sama.
publik :
Jenis atau anggota dapat diakses oleh kode lain dalam rakitan yang sama atau rakitan lain yang merujuknya.
Akses terbatas pada kelas yang mengandung atau jenis yang berasal dari kelas yang mengandung dalam majelis saat ini.
( Tersedia sejak C # 7.2 )
protected
dapat digunakan oleh setiap subclass dari majelis apa pun.
protected internal
adalah segala sesuatu yang protected
ada, ditambah juga segala sesuatu di majelis yang sama dapat mengaksesnya.
Yang penting, itu tidak berarti "subkelas dalam majelis yang sama" - itu adalah penyatuan keduanya, bukan persimpangan.
private protected
pengubah akses yang diperkenalkan pada C # 7.2
Dalam praktiknya, tentang metode:
dilindungi - dapat diakses untuk kelas yang diwarisi, jika tidak pribadi.
internal - publik hanya untuk kelas di dalam majelis, jika tidak pribadi.
metode internal terproteksi - berarti terlindungi atau internal - dapat diakses untuk kelas yang diwarisi dan untuk setiap kelas di dalam majelis.
protected
DAN internal
?
protected internal
,.
private protected
docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Masih ada banyak kebingungan dalam memahami cakupan aksesor "internal yang dilindungi", meskipun sebagian besar definisi didefinisikan dengan benar. Ini membantu saya untuk memahami kebingungan antara "dilindungi" dan "dilindungi internal":
publik benar-benar publik di dalam dan di luar majelis ( publik internal / publik eksternal )
protected benar-benar dilindungi di dalam dan di luar perakitan ( protected internal / protected external ) (tidak diizinkan di kelas tingkat atas)
private benar-benar pribadi di dalam dan di luar majelis ( privat internal / privat eksternal ) (tidak diizinkan di kelas tingkat atas)
internal benar-benar publik di dalam majelis tetapi dikecualikan di luar majelis seperti pribadi ( publik internal / eksternal dikecualikan )
internal terproteksi adalah benar-benar publik di dalam majelis tetapi dilindungi di luar majelis ( publik internal / eksternal terlindungi ) (tidak diizinkan di kelas tingkat atas)
Seperti yang Anda lihat, bagian dalam yang dilindungi adalah binatang yang sangat aneh. Tidak intuitif.
Itu sekarang menimbulkan pertanyaan mengapa Microsoft tidak membuat ( dilindungi internal / dikecualikan eksternal ), atau saya kira semacam "dilindungi pribadi" atau "dilindungi internal"? lol. Sepertinya tidak lengkap?
Ditambah dengan kebingungan adalah kenyataan bahwa Anda dapat membuat sarang anggota internal yang dilindungi publik atau publik di dalam tipe yang dilindungi, internal, atau pribadi. Mengapa Anda mengakses "internal terproteksi" bersarang di dalam kelas internal yang mengecualikan akses perakitan luar?
Microsoft mengatakan tipe bersarang seperti itu dibatasi oleh ruang lingkup tipe induknya, tetapi bukan itu yang dikatakan kompiler. Anda dapat mengkompilasi internal yang dilindungi di dalam kelas internal yang harus membatasi ruang lingkup hanya untuk perakitan.
Bagi saya ini terasa seperti desain yang tidak lengkap. Mereka harus memiliki ruang lingkup yang disederhanakan dari semua jenis ke sistem yang secara jelas mempertimbangkan pewarisan tetapi juga keamanan dan hierarki dari tipe bersarang. Ini akan membuat berbagi objek sangat intuitif dan granular daripada menemukan aksesibilitas tipe dan anggota berdasarkan sistem pelingkupan yang tidak lengkap.
Saya telah membaca definisi yang sangat jelas untuk istilah-istilah ini.
Dilindungi: Akses terbatas pada definisi kelas dan kelas apa pun yang mewarisi dari kelas. Tipe atau anggota dapat diakses hanya dengan kode di kelas yang sama atau struct atau di kelas yang berasal dari kelas itu.
Internal: Akses dibatasi hanya untuk kelas-kelas yang ditentukan dalam perakitan proyek saat ini. Jenis atau anggota hanya dapat diakses oleh kode di kelas yang sama.
Dilindungi-Internal: Akses terbatas pada perakitan saat ini atau jenis yang berasal dari kelas yang mengandung.
Anggota yang dilindungi
Anggota yang dilindungi dari suatu kelas hanya tersedia di kelas yang ada (di mana telah dinyatakan) dan di kelas turunan dalam majelis dan juga di luar majelis.
Berarti jika kelas yang berada di luar majelis dapat menggunakan anggota yang dilindungi dari majelis lain dengan mewarisi kelas itu saja.
Kita dapat mengekspos anggota yang dilindungi di luar majelis dengan mewarisi kelas itu dan menggunakannya di kelas turunan saja.
Catatan: Anggota yang dilindungi tidak dapat diakses menggunakan objek di kelas turunan.
Anggota internal
Anggota internal kelas tersedia atau akses dalam majelis baik membuat objek atau dalam kelas turunan atau Anda dapat mengatakan itu dapat diakses di semua kelas dalam majelis.
Catatan: Anggota internal tidak dapat diakses di luar majelis baik menggunakan objek yang dibuat atau dalam kelas turunan.
Dilindungi Internal
Pengubah akses internal terproteksi adalah kombinasi Protected atau Internal.
Anggota Internal yang Dilindungi dapat tersedia di dalam seluruh majelis di mana ia menyatakan dapat membuat objek atau dengan mewarisi kelas itu. Dan dapat diakses di luar perakitan di kelas turunan saja.
Catatan: Anggota Internal yang Terlindungi berfungsi sebagai Internal di dalam rakitan yang sama dan berfungsi sebagai Dilindungi untuk di luar rakitan.
publik - Anggota (Fungsi & Variabel) yang dinyatakan sebagai publik dapat diakses dari mana saja.
pribadi - Anggota pribadi tidak dapat diakses dari luar kelas. Ini adalah specifier akses default untuk anggota, yaitu jika Anda tidak menentukan specifier akses untuk anggota (variabel atau fungsi), itu akan dianggap sebagai pribadi. Oleh karena itu, string PhoneNumber; setara dengan string pribadi PhoneNumber.
protected - Anggota yang dilindungi hanya dapat diakses dari kelas anak.
internal - Ini dapat diakses hanya dalam rakitan yang sama.
protected internal - Dapat diakses di dalam rakitan yang sama maupun di kelas turunan.
Suite terbaik internal terproteksi ketika Anda ingin anggota atau tipe yang akan digunakan dalam kelas turunan dari majelis lain pada saat yang sama hanya ingin mengkonsumsi anggota atau tipe dalam majelis induk tanpa berasal dari kelas tempat dideklarasikan. Juga jika Anda hanya ingin menggunakan anggota atau tipe tanpa berasal dari kelas lain, di majelis yang sama Anda hanya dapat menggunakan internal.
protected internal
sehingga adaprotected
dalam perakitan saat ini dan benar-benar tidak tersedia secara eksternal?