Apa perbedaan antara 'dilindungi' dan 'dilindungi internal'?

244

Dapatkah seseorang tolong uraikan perbedaan antara pengubah 'terproteksi' dan 'terproteksi internal' di C #? Tampaknya mereka berperilaku dengan cara yang sama.

Embedd_Khurja
sumber

Jawaban:

402

Pengubah akses "terproteksi internal" adalah gabungan dari pengubah "terproteksi" dan "internal".

Dari MSDN, Access Modifiers (Panduan Pemrograman C #) :

dilindungi :

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 internalberarti " protectedATAU 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.

dilindungi pribadi :

Akses terbatas pada kelas yang mengandung atau jenis yang berasal dari kelas yang mengandung dalam majelis saat ini.
( Tersedia sejak C # 7.2 )

M4N
sumber
2
Bolehkah saya memiliki anggota protected internalsehingga ada protecteddalam perakitan saat ini dan benar-benar tidak tersedia secara eksternal?
Shimmy Weitzhandler
8
Itu akan "Dilindungi", bukan?
CAD berpacaran
2
@ Shimmy: Anda dapat memiliki kelas internal dengan metode yang dilindungi . Tetapi kemudian seluruh kelas tidak akan tersedia dari majelis eksternal.
M4N
1
@Shimmy lihat proposal ini untuk versi C # github.com/dotnet/roslyn/blob/features/privateProtected/docs/… yang akan datang
Nate Cook
@Shimmy Setidaknya CLR mendukung konsep persimpangan aksesibilitas terproteksi dan internal, tetapi bahasa C # tidak. C # hanya mendukung penyatuan dua pengubah akses.
RBT
89

protected dapat digunakan oleh setiap subclass dari majelis apa pun.

protected internaladalah segala sesuatu yang protectedada, 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.

Marc Gravell
sumber
3
Hanya FYI untuk pembaca yang CLR mendukung konsep persimpangan aksesibilitas internal dan terlindungi juga, tetapi C # tidak mendukung ini. C # hanya mendukung penyatuan keduanya seperti yang disebutkan dalam posting ini.
RBT
1
Hanya FYI lain untuk pembaca, "subkelas dalam rakitan yang sama" dapat dicapai dengan private protectedpengubah akses yang diperkenalkan pada C # 7.2
LordWilmore
52

- Perbarui jawaban 2019 -

Anda dapat menemukan perbedaan dalam aksesibilitas berdasarkan tabel di bawah ini ya,

masukkan deskripsi gambar di sini

Andi AR
sumber
4
Jawaban yang indah, sangat jelas mengkomunikasikan perbedaan antara setiap pengubah akses.
e_i_pi
23

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.

abatishchev
sumber
1
Saya akan menggunakan ATAU untuk menyatakan bahwa penyebabnya adalah keduanya tidak benar.
Brian Rasmussen
Saya tidak sepenuhnya setuju dengan bagian "untuk mengubah perilaku kelas dasar" dalam deskripsi "dilindungi". Saya akan mengatakan ini adalah di mana Anda menggunakan "virtual" (pada kelas dasar) dan "menimpa" (pada kelas turunan).
M4N
Apakah ada cara untuk menandai anggota sebagai protectedDAN internal?
Shimmy Weitzhandler
@ Kimmy: ya protected internal,.
abatishchev
1
@ Kimmy dua tahun kemudian, dan ya. Sekarang ada cara di C # 7.2. Namanya private protected docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Pauli Østerø
10

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.

Stokely
sumber
1
private protected sekarang telah ditambahkan ke C # 7.2 yang pada dasarnya adalah internal DAN dilindungi.
Pauli Østerø
7

dilindungi : variabel atau metode hanya akan tersedia untuk kelas anak (dalam perakitan apa pun)

internal terlindungi : tersedia untuk kelas anak di majelis apa pun dan untuk semua kelas dalam majelis yang sama

Benjamin
sumber
3

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.

Ammar Asjad
sumber
1

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.

Mostafa Bouzari
sumber
1

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.

Piush shukla
sumber
0

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.

satishpkumarin
sumber