Adakah alasan untuk menulis kata kunci "pribadi" di C #?

109

Sejauh yang saya tahu, privateadalah standar di mana-mana di C # (yang berarti bahwa jika saya tidak menulis public, protected, internal, dll maka akan privatesecara default). (Mohon koreksi saya jika saya salah.)

Jadi, apa alasan untuk menulis kata kunci itu, atau mengapa kata kunci itu ada untuk anggota?

Misalnya, ketika pengendali kejadian dibuat secara otomatis, tampilannya seperti ini:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

Tetapi mengapa bahkan menulis pribadi jika itu tersirat dan default? Hanya agar pengembang pemula (yang tidak tahu ini adalah C # default) tahu bahwa itu pribadi? Atau apakah ada perbedaan untuk kompilernya?

Selain itu, adakah kasus di mana menulis "private" (sendiri) akan mengubah aksesibilitas anggota?

Camilo Martin
sumber
18
IIRC, jenis "tingkat atas" akan menjadi internaldefault.
Jeff Mercado
4
Default untuk semuanya tidak pribadi, seperti yang ditunjukkan, dan sebagai pedoman umum lebih baik untuk eksplisit.
James Michael Hare
Default untuk semuanya adalah "seadil mungkin". Jelas kelas non-bertingkat tidak bisa pribadi, atau tidak ada yang bisa membuat instance atau menggunakannya. Tetapi anggota bersifat pribadi secara default, dan kelas bertingkat bersifat pribadi secara default. Segala sesuatu di C #, secara default, memiliki tingkat visibilitas paling terbatas yang dapat dimilikinya.
Ryan Lundy

Jawaban:

171

AFAIK, privat adalah default dimanapun di C # (artinya jika saya tidak menulis publik, dilindungi, internal, dll. Itu akan menjadi privat secara default). (tolong koreksi saya jika salah).

Ini tidak benar. Jenis yang didefinisikan dalam namespace (kelas, struct, antarmuka, dll) akan menjadi internal secara default. Juga, anggota dalam tipe yang berbeda memiliki aksesibilitas default yang berbeda (seperti publik untuk anggota antarmuka). Untuk detailnya, lihat Tingkat Aksesibilitas di MSDN.

Juga,

Jadi, apa alasan untuk menulis kata kunci tersebut, atau mengapa kata kunci itu ada?

Menentukan ini secara eksplisit membantu menunjukkan niat Anda untuk menjadikan jenis ini pribadi, dengan sangat eksplisit. Ini membantu menjaga kode Anda dari waktu ke waktu. Ini dapat membantu pengembang lain (atau diri Anda sendiri) mengetahui apakah anggota bersifat pribadi secara default atau sengaja, dll.

Reed Copsey
sumber
1
@Wayne: dia punya jawaban dengan skor lebih tinggi dari Jon Skeet tapi dia tidak pantas mendapatkannya ... Jawaban Jon jauh lebih akurat.
aleroot
2
Ini adalah perbedaan yang tidak berarti. Jenis dalam namespace adalah internal secara default karena tidak bisa menjadi pribadi secara default; kalau tidak, tidak ada yang bisa menggunakannya. Mereka masih seketat mungkin, secara default.
Ryan Lundy
1
Aksesibilitas anggota default untuk kelas inisde dan struct bersifat pribadi. Periksa di sini: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca
Tapi elemen di dalam namespace tidak bisa private.
Shimmy Weitzhandler
Juga, getdan setdefault ke aksesibilitas properti itu sendiri
AustinWBryan
119

AFAIK, privat adalah default dimanapun di C #

Kurang tepat - defaultnya adalah "akses paling terbatas yang tersedia untuk deklarasi ini". Jadi misalnya, dengan tipe tingkat atas defaultnya adalah internal; untuk tipe bersarang, defaultnya adalah private.

Jadi, apa alasan untuk menulis kata kunci tersebut, atau mengapa kata kunci itu ada?

Itu membuatnya eksplisit, yang bagus karena dua alasan:

  • Itu membuatnya lebih jelas bagi mereka yang tidak tahu defaultnya, sesuai pertanyaan Anda (saya tidak pernah menyukai argumen ini, secara pribadi, tapi saya pikir itu layak disebutkan)
  • Ini memberi kesan bahwa Anda sengaja memutuskan untuk membuatnya pribadi, daripada hanya pergi dengan default.

Adapun bagian terakhir Anda:

Selain itu, adakah kasus di mana menulis "private" (sendiri) akan mengubah aksesibilitas anggota?

Ya, untuk membuat separuh properti lebih ketat daripada yang lain:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

Saya biasanya menggunakan default di mana pun saya bisa, tetapi saya telah diyakinkan (sebagian oleh Eric Lippert) bahwa memperjelas bahwa Anda telah memikirkannya dan memutuskan untuk membuat sesuatu yang bersifat pribadi adalah ide yang bagus.

Secara pribadi saya berharap ada cara untuk melakukan itu untuk disegel / tidak disegel, juga, untuk deklarasi tipe - bahkan mungkin tidak memiliki default. Saya menduga bahwa banyak pengembang (termasuk saya sendiri jika saya tidak berhati-hati) membiarkan kelas tidak disegel hanya karena usaha yang lebih sedikit daripada membuatnya tersegel.

Jon Skeet
sumber
+1. Menggunakan kata kunci yang tidak relevan untuk memberi sinyal maksud semantik berguna, meskipun latar belakang Java saya menggunakan finalcontoh yang lebih umum.
tafsirkan
1
@minitech: Cara lain juga berfungsi, tetapi kurang berguna. Ini semua diperkenalkan di C # 2.
Jon Skeet
20
Saya tentu berharap tidak ada default sama sekali dan kompiler hanya memberikan kesalahan jika pengubah akses hilang. Saya tidak berpikir kebanyakan orang tahu apa default untuk setiap situasi, yang kemudian menyebabkan kesalahan yang tidak diinginkan.
+1 "untuk jenis bersarang, defaultnya adalah pribadi" - Saya baru tahu tentang ini ketika saya membaca jawaban Anda. Terima kasih!
Nordin
5
@Phong, untuk C # ada satu aturan mudah: Secara default, semuanya bersifat privat sebagaimana mestinya . Item dalam namespace seperti kelas non-bertingkat tidak boleh bersifat pribadi, karena tidak ada yang bisa menggunakannya. Mereka hanya dapat bersifat internal atau publik; jadi secara default, mereka internal. Hal-hal di dalam hal lain (enum dalam kelas; kelas bersarang; properti; bidang; metode ...) bersifat pribadi secara default.
Ryan Lundy
11

privatemenambah kekacauan visual. Kepada mereka yang bersikeras bahwa itu membuat sesuatu menjadi eksplisit, saya akan bertanya: Apakah Anda melakukan ini dengan matematika juga? Misalnya:

var answer = a + b / c;

Apakah Anda merasa tidak jelas tanpa tanda kurung yang berlebihan b / c?

Aturan di C # sangat sederhana: Secara default, semuanya sedekat mungkin dengan privat. Jadi jika Anda membutuhkan sesuatu agar lebih terlihat daripada default, tambahkan pengubah. Jika tidak, jangan tambahkan kata kunci yang tidak perlu ke kode Anda.

Ryan Lundy
sumber
1
Saya dulu setuju dengan hak ini sebelum mengajukan pertanyaan. Tetapi, beberapa orang menulis VB, beberapa C ++, beberapa bahkan F # (mungkin berasal dari bahasa fungsional lain seperti Haskell?), Lebih baik daripada yang mereka lakukan di C #. Jadi, bagi mereka (dan bagi kita jika kita melupakannya setelah 2 tahun tanpa c # ing) lebih baik jika pengakses eksplisit. Jangan meremehkan dampak pembelajaran mudah terhadap sebuah proyek, banyak pengembang berasal dari latar belakang yang mungkin tidak mencerminkan alat pilihan, dan mereka memang membutuhkan alat bantu belajar, bahkan dalam kode produksi, ini tidak buruk sama sekali (dan kita tahu banyak kode C # sangat buruk, jadi beberapa bantuan membantu kami juga).
Camilo Martin
3
Ya, tentu, di VB defaultnya mengerikan. Saya pikir visibilitas default adalah Frienduntuk anggota, misalnya. C # melakukan visibilitas default dengan cara yang benar: Hal-hal diatur ke visibilitas paling tidak mungkin kecuali jika diubah. Dari apa yang dapat saya temukan, tampaknya hal yang sama berlaku untuk C ++ (kecuali struct). (Tampaknya tidak benar untuk F #.)
Ryan Lundy
6
Aneh bagi saya bahwa begitu banyak orang yang menyukai var, karena mengurangi kekacauan visual, namun begitu banyak orang yang mendukung pengetikan tanpa tujuan private.
Ryan Lundy
2
Saya bahkan akan melangkah lebih jauh dengan menyatakan bahwa kekacauan visual menghambat keterbacaan!
binki
1
upvoted meskipun saya tidak suka menggunakan kurung dalam kasus contoh matematika Anda.
Marc. 2377
7

Sejauh yang saya tahu, pribadi adalah default di mana-mana di C #

Mendeklarasikan pribadi secara eksplisit , berarti Anda tahu itu pribadi. Bukan hanya berpikir begitu, karena sejauh yang Anda tahu, itu adalah default. Ini juga berarti bahwa orang lain yang melihat kode tersebut mengetahui apa itu.

Tidak ada "Saya pikir itu", "Saya cukup yakin itu", dll. Hanya itu . Dan semua orang ada di halaman yang sama.

Saya bukan pengembang C # . Jika saya harus bekerja dengan beberapa kode yang tidak secara eksplisit dinyatakan sebagai pribadi , saya mungkin akan menganggapnya internal .

Saya tidak suka ketika hal-hal diatur secara implisit. Tidak pernah sejelas kapan mereka ditetapkan secara eksplisit.

JD Isaacks
sumber
Kedengarannya masuk akal, saya bahkan melupakan dasar-dasar bahasa yang dulu saya kuasai.
Camilo Martin
6

Keterbacaan - Tidak semua orang tahu bahwa privat adalah perilaku default.

Intent - Memberikan indikasi yang jelas bahwa Anda telah secara spesifik menyatakan properti tersebut sebagai properti (untuk alasan apa pun).

James
sumber
5

Keterbacaan, demonstrasi niat adalah dua alasan besar yang dapat saya pikirkan.

Nyonya
sumber
Sepakat. Misalnya, jika Anda bekerja dengan pengembang lain tentang sedikit kode, menyetel sesuatu ke privat membantu menunjukkan niat Anda. Ini juga membantu ketika Anda kembali ke kode Anda setelah beberapa tahun dan IDE Anda dapat memberi tahu Anda metode apa yang harus dapat diakses publik untuk kelas itu.
Aaron Newton
3

Satu alasan bagus untuk menentukan visibilitas secara eksplisit adalah agar Anda tidak perlu memikirkan tentang default untuk konteks tempat Anda berada.

Alasan bagus lainnya adalah karena FxCop menyuruh Anda melakukannya.

Patrick McDonald
sumber
+1, Saya baru saja mengetahui tentang FxCop yang mengeluh tentang saya menghapus pengubah pribadi sekarang ketika saya membuat perubahan.
Camilo Martin
2

Banyak orang (orang-orang seperti saya!) Secara teratur membuat program dalam beberapa bahasa berbeda. Menjadi eksplisit dengan hal-hal seperti ini mencegah saya dari kebutuhan untuk mengingat semua detail misterius dari semua bahasa yang saya programkan.

davidtbernal.dll
sumber
1
Saya tidak akan mengatakan "pengubah akses default adalah private" adalah detail misterius ... Tapi saya mengerti intinya. Suatu hari saya kesulitan mengingat bagaimana kerangka kerja yang saya gunakan minggu lalu ( MEF ) bekerja.
Camilo Martin
0

Saya akan mengatakan untuk konsistensi dengan keterbacaan ruang lingkup kelas lainnya.

MGZero
sumber
4
Anda sedang memikirkan C ++. Di C #, bahkan di struct, default anggota ke pribadi.
3
Structs tidak memiliki aksesibilitas publik secara default - lihat: msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Reed Copsey