Ada banyak kode di salah satu proyek kami yang terlihat seperti ini:
internal static class Extensions
{
public static string AddFoo(this string s)
{
if (s == null)
{
return "Foo";
}
return $({s}Foo);
}
}
Apakah ada alasan eksplisit untuk melakukan hal ini selain "lebih mudah untuk membuat tipe publik nanti?"
Saya menduga itu hanya masalah dalam kasus tepi yang sangat aneh (refleksi di Silverlight) atau tidak sama sekali.
return s + "Foo";
? The+
operator tidak peduli nol atau string kosong.Jawaban:
UPDATE: Pertanyaan ini adalah topik blog saya pada bulan September 2014 . Terima kasih atas pertanyaannya!
Ada banyak perdebatan tentang pertanyaan ini bahkan di dalam tim penyusun itu sendiri.
Pertama, adalah bijaksana untuk memahami aturan. Anggota publik dari kelas atau struct adalah anggota yang dapat diakses oleh apa pun yang dapat mengakses tipe yang mengandung . Jadi anggota publik dari kelas internal secara efektif internal.
Jadi sekarang, dengan kelas internal, haruskah anggotanya yang ingin Anda akses di majelis ditandai sebagai publik atau internal?
Pendapat saya adalah: tandai anggota tersebut sebagai publik.
Saya menggunakan "publik" yang berarti "anggota ini bukan detail implementasi". Anggota yang dilindungi adalah detail implementasi; ada sesuatu tentang hal itu yang akan dibutuhkan untuk membuat pekerjaan kelas yang diturunkan. Anggota internal adalah detail implementasi; sesuatu yang lain di dalam majelis ini membutuhkan anggota untuk bekerja dengan benar. Anggota publik mengatakan "anggota ini mewakili kunci, fungsi terdokumentasi yang disediakan oleh objek ini."
Pada dasarnya, sikap saya adalah: seandainya saya memutuskan untuk membuat kelas internal ini menjadi kelas publik. Untuk melakukan itu, saya ingin mengubah satu hal : aksesibilitas kelas. Jika mengubah kelas internal menjadi kelas publik berarti saya harus juga mengubah anggota internal menjadi anggota publik, maka anggota itu adalah bagian dari area permukaan publik dari kelas tersebut, dan itu seharusnya sudah menjadi publik di tempat pertama.
Orang lain tidak setuju. Ada kontingen yang mengatakan bahwa mereka ingin dapat melirik deklarasi anggota dan segera tahu apakah itu akan dipanggil hanya dari kode internal.
Sayangnya, itu tidak selalu berhasil dengan baik; misalnya, kelas internal yang mengimplementasikan antarmuka internal masih harus memiliki anggota pelaksana yang ditandai sebagai publik, karena mereka adalah bagian dari permukaan publik kelas .
sumber
public
sangat meyakinkan. Namun, saya menemukan "tidak selalu berhasil dengan baik ..." menjadi sangat kuat. Kehilangan konsistensi mendevaluasi setiap manfaat "sekilas". Menggunakaninternal
cara ini berarti secara sengaja membangun intuisi yang terkadang salah. Memiliki intuisi yang sebagian besar benar adalah IMO hal yang mengerikan untuk pemrograman.Jika kelasnya
internal
, tidak masalah dari sudut pandang aksesibilitas apakah Anda menandai suatu metodeinternal
ataupublic
. Namun masih bagus untuk menggunakan tipe yang akan Anda gunakan jika kelasnyapublic
.Sementara beberapa mengatakan bahwa ini memudahkan transisi dari
internal
kepublic
. Ini juga berfungsi sebagai bagian dari deskripsi metode.Internal
metode biasanya dianggap tidak aman untuk akses tidak terbatas, sementarapublic
metode dianggap (sebagian besar) permainan gratis.Dengan menggunakan
internal
ataupublic
seperti yang Anda lakukan dipublic
kelas, Anda memastikan bahwa Anda mengkomunikasikan gaya akses apa yang diharapkan, sementara juga memudahkan pekerjaan yang diperlukan untuk membuat kelaspublic
di masa depan.sumber
Saya sering menandai metode saya di kelas internal publik daripada internal sebagai a) itu tidak masalah dan b) Saya menggunakan internal untuk menunjukkan bahwa metode ini internal sengaja (ada beberapa alasan mengapa saya tidak ingin mengekspos ini metode dalam kelas publik.Oleh karena itu, jika saya memiliki metode internal saya benar-benar harus memahami alasan mengapa itu internal sebelum mengubahnya ke publik sedangkan jika saya berurusan dengan metode publik di kelas internal saya benar-benar harus memikirkan mengapa kelas internal sebagai lawan mengapa setiap metode internal.
sumber
Saya menduga bahwa "lebih mudah untuk membuat tipe publik nanti?" Apakah itu.
Aturan pelingkupan berarti bahwa metode tersebut hanya akan terlihat sebagai
internal
- jadi tidak masalah apakah metode tersebut ditandaipublic
atau tidakinternal
.Satu kemungkinan yang terlintas dalam pikiran adalah bahwa kelas tersebut bersifat publik dan kemudian diubah menjadi
internal
dan pengembang tidak repot-repot mengubah semua metode pengubah aksesibilitas metode.sumber
Dalam beberapa kasus, mungkin juga tipe internal mengimplementasikan antarmuka publik yang berarti bahwa setiap metode yang didefinisikan pada antarmuka itu masih harus dinyatakan sebagai publik.
sumber
Itu sama, metode publik akan benar-benar ditandai sebagai internal karena itu di dalam kelas internal, tetapi memiliki kelebihan (seperti yang Anda tuju), jika Anda ingin menandai kelas sebagai publik, Anda harus mengubah lebih sedikit kode.
sumber
internal
kata anggota itu hanya dapat diakses dari dalam majelis yang sama. Kelas lain dalam majelis itu dapat mengaksesinternal public
anggota, tetapi tidak akan dapat mengaksesprivate
atauprotected
anggota,internal
atau tidak.sumber
internal
bukanpublic
, visibilitas mereka tidak akan berubah. Saya percaya itulah yang ditanyakan OP.Saya benar-benar berjuang dengan ini hari ini. Sampai sekarang saya akan mengatakan bahwa semua metode harus ditandai dengan
internal
jika kelas ituinternal
dan akan menganggap hal lain hanya pengkodean atau kemalasan yang buruk, khususnya dalam pengembangan usaha; Namun, saya harus sub kelaspublic
kelas dan menimpa salah satu metode itu:Metode itu HARUS
public
dan membuat saya berpikir bahwa sebenarnya tidak ada titik logis untuk menetapkan metodeinternal
kecuali jika memang benar-benar harus, seperti kata Eric Lippert.Sampai sekarang saya tidak pernah benar-benar berhenti untuk memikirkannya, saya hanya menerimanya, tetapi setelah membaca posting Eric itu benar-benar membuat saya berpikir dan setelah banyak berunding itu masuk akal.
sumber
Memang ada perbedaan. Dalam proyek kami, kami telah membuat banyak kelas internal, tetapi kami melakukan uji unit dalam perakitan lain dan dalam info perakitan kami, kami menggunakan InternalsVisibleTo untuk memungkinkan perakitan UnitTest memanggil kelas internal. Saya perhatikan jika kelas internal memiliki konstruktor internal, kami tidak dapat membuat instance menggunakan Activator.CreateInstance di unit test assembly untuk beberapa alasan. Tetapi jika kita mengubah konstruktor ke publik tetapi kelas masih internal, itu berfungsi dengan baik. Tapi saya kira ini adalah kasus yang sangat langka (Seperti yang Eric katakan dalam posting asli: Reflection).
sumber
Saya pikir saya punya pendapat tambahan tentang ini. Pada awalnya, saya bertanya-tanya tentang bagaimana masuk akal untuk menyatakan sesuatu kepada publik di kelas internal. Kemudian saya berakhir di sini, membaca bahwa mungkin baik jika Anda kemudian memutuskan untuk mengubah kelas menjadi publik. Benar. Jadi, sebuah pola terbentuk dalam pikiran saya: Jika itu tidak mengubah perilaku saat ini, maka permisif, dan biarkan hal-hal yang tidak masuk akal (dan tidak sakit) dalam keadaan kode saat ini, tetapi nanti akan, jika Anda ubah deklarasi kelas.
Seperti ini:
Menurut "pola" yang telah saya sebutkan di atas, ini seharusnya baik-baik saja. Ini mengikuti ide yang sama. Berperilaku sebagai
private
metode, karena Anda tidak dapat mewarisi kelas. Tetapi jika Anda menghapussealed
kendala, itu masih valid: kelas yang diwarisi dapat melihat metode ini, yang benar-benar apa yang ingin saya capai. Tetapi Anda mendapat peringatan:,CS0628
atauCA1047
. Keduanya adalah tentang tidak menyatakanprotected
anggota disealed
kelas. Selain itu, saya telah menemukan persetujuan penuh, tentang hal itu tidak masuk akal: peringatan 'Anggota yang dilindungi di kelas tertutup' (kelas tunggal)Jadi setelah peringatan dan diskusi ini dikaitkan, saya telah memutuskan untuk menjadikan semuanya internal atau kurang, di kelas internal, karena lebih sesuai dengan jenis pemikiran itu, dan kami tidak mencampur "pola" yang berbeda.
sumber