Sebagai bagian dari dokumentasi Roslyn tentang GitHub, ada halaman yang disebut status implementasi fitur Bahasa , dengan fitur bahasa yang direncanakan untuk C # dan VB.
Salah satu fitur yang saya tidak dapat membungkus kepala saya adalah private protected
pengubah akses:
private protected string GetId() { … }
Ada juga halaman Catatan Desain Bahasa C # , yang menjelaskan banyak fitur baru, tetapi tidak yang ini.
Eric Lippert berkata dalam komentar :
Kesalahan Anda adalah menganggap pengubah sebagai peningkatan pembatasan. Pengubah sebenarnya selalu mengurangi batasan. Ingat, semuanya "pribadi" secara default; hanya dengan menambahkan pengubah Anda membuatnya kurang dibatasi.
Apa artinya private protected
? Kapan saya bisa menggunakannya?
c#
access-modifiers
c#-6.0
c#-7.2
Kobi
sumber
sumber
protected & internal
,assembly protected
atauproternal
(saya harap beberapa di antaranya adalah lelucon). Ada juga utas Diskusi dengan beberapa wawasan yang bagus.protected | internal
danprotected & internal
Jawaban:
Menurut " Professional C # 2008 " oleh De Bill Evjen dan Jay Glynn, halaman 1699:
C ++ / CLI memiliki fitur serupa - Tentukan dan Konsumsi Kelas dan Struktur (C ++ / CLI)> Visibilitas Anggota :
sumber
internal
sejenis tanpa mengharuskan anggota itu sendiri terkena segala sesuatu di majelis?internal
.internal
visibilitas (terkait dengan di mana kelas didefinisikan) benar-benar ortogonal kepublic
/protected
/private
visibilitas (terkait dengan warisan) dan bahwa, mungkin,internal
harus pengubah sendiri terpisah daripublic
/protected
/private
.package
di Jawa lebih mirip namespace di C #.Berikut ini semua pengubah akses dalam diagram Venn, dari yang lebih membatasi hingga yang lebih bebas:
private
:private protected
: - ditambahkan dalam C # 7.2internal
:protected
:protected internal
:public
:sumber
Ini hanya untuk memberikan grafik (dibuat dengan http://ashitani.jp/gv/ ) dari tingkat aksesibilitas yang berbeda (gambar tidak sesuai dengan komentar).
Setiap panah berarti "lebih membatasi daripada".
Nama-nama CLR adalah
Private
,FamilyANDAssembly
,Assembly
,Family
,FamilyORAssembly
,Public
.Sunting kemudian: Ternyata tingkat akses baru yang bagus ini (dengan nama yang sangat buruk) pada akhirnya tidak termasuk dalam C # 6.0. Ini didukung hanya dari C # 7.2 (dan saya melihat Anda memperbarui "tag" pertanyaan Anda).
sumber
a → b
dalam diagram berarti "a
lebih membatasi daripadab
", jadi Anda dapat "membaca" panah sebagai "lebih membatasi daripada" (itulah yang saya coba jelaskan), jadi panah menunjuk pada yang paling tidak membatasi " arah". Kebalikan dari konvensi untuk panah bisa saja sama baiknya, tetapi saya harus memilih satu konvensi.Ini hanya tebakan, tetapi dari nama Anda mungkin bisa menebak itu versi yang lebih terbatas
protected
, (atau versi yang lebih santaiprivate
jika Anda mau). Dan hanya varian yang masuk akal yang membatasiprotected
perilaku perakitan.Kemungkinan penggunaan: maka Anda ingin memilikinya
protected
untuk implementasi internal, tetapi tidak untuk penggunaan eksternal (dan Anda tidak ingin menyegel kelas).PS Itu selalu ada di CLR, tetapi tidak di C # . Ini kombinasi dari
protected
daninternal
, kutipan:sumber
"Mungkin" hanya dapat dilihat oleh subkelas yang berada dalam rakitan yang sama. Ini membuatnya sedikit dibatasi daripada
protected
.sumber
Lihat spesifikasi untuk fitur "dilindungi pribadi":
sumber