Sangat umum untuk melihat _var
nama variabel di bidang kelas. Apa arti garis bawah? Apakah ada referensi untuk semua konvensi penamaan khusus ini?
c#
c++
naming-conventions
Stan
sumber
sumber
Jawaban:
Garis bawah hanyalah sebuah konvensi; tidak ada lagi. Dengan demikian, penggunaannya selalu agak berbeda untuk setiap orang. Inilah cara saya memahami mereka untuk dua bahasa yang dimaksud:
Dalam C ++, garis bawah biasanya menunjukkan variabel anggota pribadi.
Dalam C #, saya biasanya melihatnya hanya digunakan ketika mendefinisikan variabel anggota pribadi yang mendasari untuk properti publik. Variabel anggota pribadi lainnya tidak akan memiliki garis bawah. Penggunaan ini sebagian besar telah pergi ke pinggir jalan dengan munculnya sifat otomatis sekalipun.
Sebelum:
Setelah:
sumber
public string Name { get; private set; }
. Benar, ini tidak sepenuhnya berubah, tetapi ada di sana._var
tidak dicadangkan.Ini adalah praktik terbaik untuk TIDAK menggunakan UNDERSCORES sebelum nama variabel atau nama parameter dalam C ++
Nama-nama yang dimulai dengan garis bawah atau garis bawah ganda DILINDUNGI untuk para pelaksana C ++. Nama dengan garis bawah dicadangkan agar perpustakaan berfungsi.
Jika Anda membaca di C ++ Coding Standard, Anda akan melihat bahwa di halaman pertama tertulis:
Lebih khusus, draft kerja ISO menyatakan aturan aktual:
Ini adalah praktik terbaik untuk menghindari memulai simbol dengan garis bawah jika Anda secara tidak sengaja berkeliaran di salah satu batasan di atas.
Anda bisa melihatnya sendiri mengapa penggunaan garis bawah seperti itu bisa menjadi bencana ketika mengembangkan perangkat lunak:
Coba kompilasi program helloWorld.cpp sederhana seperti ini:
Anda akan melihat semua yang terjadi di latar belakang. Berikut ini cuplikannya:
Anda dapat melihat berapa banyak nama yang dimulai dengan garis bawah ganda!
Juga jika Anda melihat fungsi anggota virtual, Anda akan melihat bahwa * _vptr adalah pointer yang dihasilkan untuk tabel virtual yang secara otomatis akan dibuat ketika Anda menggunakan satu atau lebih fungsi anggota virtual di kelas Anda! Tapi itu cerita lain ...
Jika Anda menggunakan garis bawah, Anda mungkin mengalami masalah konflik dan Anda TIDAK AKAN MEMILIKI IDEA apa yang menyebabkannya, sampai semuanya terlambat.
sumber
Sebenarnya
_var
konvensi berasal dari VB bukan C # atau C ++ (m _, ... adalah hal lain).Ini datang untuk mengatasi ketidakpekaan huruf VB ketika mendeklarasikan Properties.
Misalnya, kode seperti itu tidak dimungkinkan dalam VB karena menganggap
user
danUser
sebagai pengidentifikasi yang samaJadi untuk mengatasi ini, beberapa menggunakan konvensi untuk menambahkan '_' ke bidang pribadi untuk datang seperti ini
Karena banyak konvensi untuk .Net dan untuk menjaga keseragaman antara konvensi C # et VB.NET, mereka menggunakan yang sama.
Saya menemukan referensi untuk apa yang saya katakan: http://10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices
sumber
Komentator pertama (R Samuel Klatchko) direferensikan: Apa aturan tentang menggunakan garis bawah dalam pengidentifikasi C ++? yang menjawab pertanyaan tentang garis bawah di C ++. Secara umum, Anda tidak seharusnya menggunakan garis bawah utama, karena disediakan untuk pelaksana kompiler Anda. Kode yang Anda lihat
_var
mungkin adalah kode lama, atau kode yang ditulis oleh seseorang yang tumbuh menggunakan sistem penamaan lama yang tidak disukai pemimpin garis bawah.Sebagai jawaban lain menyatakan, ini digunakan untuk digunakan dalam C + + untuk mengidentifikasi variabel anggota kelas. Namun, tidak memiliki arti khusus sejauh dekorator atau sintaks berjalan. Jadi jika Anda ingin menggunakannya, itu akan dikompilasi.
Saya akan menyerahkan diskusi C # kepada orang lain.
sumber
_var tidak memiliki arti dan hanya melayani tujuan untuk membuatnya lebih mudah untuk membedakan bahwa variabel tersebut adalah variabel anggota pribadi.
Dalam C ++, menggunakan konvensi _var adalah bentuk yang buruk, karena ada aturan yang mengatur penggunaan garis bawah di depan pengidentifikasi. _var dicadangkan sebagai pengidentifikasi global, sedangkan _Var (garis bawah + huruf kapital) dicadangkan kapan saja. Inilah sebabnya mengapa di C ++, Anda akan melihat orang yang menggunakan konvensi var_ sebagai gantinya.
sumber
Anda dapat membuat pedoman pengkodean Anda sendiri. Cukup tulis dokumentasi yang jelas untuk anggota tim lainnya.
Menggunakan _field membantu Intelilsense untuk memfilter semua variabel kelas cukup mengetik _.
Saya biasanya mengikuti Pedoman Brad Adams , tetapi disarankan untuk tidak menggunakan garis bawah.
sumber
Microsoft penamaan standar untuk C # kata variabel dan parameter harus menggunakan bentuk kasus unta lebih rendah IE:
paramName
. Standar ini juga menyerukan bidang untuk mengikuti bentuk yang sama tetapi hal ini dapat menyebabkan kode tidak jelas sehingga banyak tim panggilan untuk awalan garis bawah untuk meningkatkan kejelasan IE:_fieldName
.sumber
Dengan C #, Pedoman Desain Kerangka Microsoft menyarankan untuk tidak menggunakan karakter garis bawah untuk anggota publik . Untuk anggota pribadi , garis bawah tidak masalah untuk digunakan. Bahkan, Jeffrey Richter (sering dikutip dalam pedoman) menggunakan m_ misalnya dan "s_" untuk anggota statis pribadi.
Secara pribadi, saya menggunakan _ hanya untuk menandai anggota pribadi saya. "m_" dan "s_" ambang pada notasi Hungaria yang tidak hanya disukai di .NET, tetapi bisa sangat verbose dan saya menemukan kelas dengan banyak anggota sulit untuk melakukan pemindaian mata cepat secara alfabet (bayangkan 10 variabel semua dimulai dengan m_) .
sumber
Saya menggunakan penamaan _var untuk variabel anggota kelas saya. Ada 2 alasan utama yang saya lakukan:
1) Ini membantu saya melacak variabel kelas dan variabel fungsi lokal ketika saya membaca kode saya nanti.
2) Ini membantu dalam Intellisense (atau sistem penyelesaian kode lainnya) ketika saya sedang mencari variabel kelas. Mengetahui karakter pertama sangat membantu dalam memfilter daftar variabel dan metode yang tersedia.
sumber
Sejauh menyangkut bahasa C dan C ++, tidak ada arti khusus untuk garis bawah pada nama (awal, tengah atau akhir). Itu hanya karakter nama variabel yang valid. "Konvensi" berasal dari praktik pengkodean dalam komunitas pengkodean.
Seperti yang telah ditunjukkan oleh berbagai contoh di atas, _ pada awalnya dapat berarti anggota kelas yang pribadi atau dilindungi dalam C ++.
Biarkan saya memberikan sedikit sejarah yang mungkin menyenangkan. Di UNIX jika Anda memiliki fungsi pustaka inti C dan kernel back-end di mana Anda ingin mengekspos fungsi kernel ke ruang pengguna juga _ terjebak di depan fungsi stub yang memanggil fungsi kernel secara langsung tanpa melakukan hal lain. Contoh yang paling terkenal dan dikenal adalah exit () vs _exit () di bawah kernel tipe BSD dan SysV: Di sana, exit () melakukan hal-hal ruang-pengguna sebelum memanggil layanan keluar kernel, sedangkan _exit hanya memetakan ke layanan keluar kernel.
Jadi _ digunakan untuk barang-barang "lokal" dalam hal ini lokal menjadi mesin-lokal. Biasanya _functions () tidak portabel. Karena itu Anda seharusnya tidak mengharapkan perilaku yang sama di berbagai platform.
Sekarang untuk _ dalam nama variabel, seperti
int _foo;
Nah secara psikologis, _ adalah hal yang aneh harus mengetik di awal. Jadi jika Anda ingin membuat nama variabel yang memiliki peluang lebih kecil untuk berbenturan dengan sesuatu yang lain, TERUTAMA saat berurusan dengan penggantian pra-prosesor yang ingin Anda pertimbangkan penggunaan _.
Saran dasar saya adalah untuk selalu mengikuti konvensi komunitas pengkodean Anda, sehingga Anda dapat berkolaborasi secara lebih efektif.
sumber
Ini berarti bahwa itu adalah bidang anggota di kelas.
sumber
Tidak ada konvensi penamaan tunggal, tetapi saya telah melihatnya untuk anggota pribadi.
sumber
Banyak orang suka bidang pribadi diawali dengan garis bawah. Itu hanya konvensi penamaan.
Konvensi penamaan 'resmi' C # menentukan nama huruf kecil sederhana (tanpa garis bawah) untuk bidang pribadi.
Saya tidak mengetahui konvensi standar untuk C ++, meskipun garis bawah sangat banyak digunakan.
sumber
Ini hanya sebuah konvensi yang digunakan oleh beberapa programmer untuk memperjelas ketika Anda memanipulasi anggota kelas atau beberapa jenis variabel lainnya (parameter, lokal ke fungsi, dll). Konvensi lain yang juga digunakan secara luas untuk variabel anggota adalah awalan nama dengan 'm_'.
Bagaimanapun, ini hanya konvensi dan Anda tidak akan menemukan satu sumber pun untuk semuanya. Mereka masalah gaya dan masing-masing tim pemrograman, proyek atau perusahaan memiliki sendiri (atau bahkan tidak punya).
sumber
Ada alasan yang sepenuhnya sah untuk menggunakannya dalam C #: jika kode juga dapat diperluas dari VB.NET. (Kalau tidak, aku tidak akan.)
Karena VB.NET tidak peka huruf besar-kecil, tidak ada cara mudah untuk mengakses
field
anggota yang dilindungi dalam kode ini:Misalnya ini akan mengakses pengambil properti, bukan bidang:
Heck, saya bahkan tidak bisa menulis
field
dalam huruf kecil - VS 2010 terus memperbaikinya.Agar mudah diakses oleh kelas turunan di VB.NET, kita harus membuat konvensi penamaan yang lain. Mengawali garis bawah mungkin adalah yang paling tidak mengganggu dan paling "diterima secara historis" dari mereka.
sumber
Sekarang notasi menggunakan "ini" seperti dalam this.foobarbaz dapat diterima untuk variabel anggota kelas C #. Ini menggantikan notasi "m_" lama atau hanya "__". Itu membuat kode lebih mudah dibaca karena tidak ada keraguan apa yang sedang referensi.
sumber
Dari pengalaman saya (tentu terbatas), garis bawah akan menunjukkan bahwa itu adalah variabel anggota pribadi. Seperti yang dikatakan Gollum, ini akan tergantung pada tim.
sumber
Pertanyaan lama, jawaban baru (C #).
Penggunaan lain dari garis bawah untuk C # adalah dengan ASP NET Core (ketergantungan injeksi).
readonly
Variabel pribadi dari kelas yang ditugaskan ke antarmuka yang disuntikkan selama konstruksi harus dimulai dengan garis bawah. Saya kira ini adalah perdebatan apakah akan menggunakan garis bawah untuk setiap anggota kelas (walaupun Microsoft sendiri mengikutinya) tetapi yang ini pasti.sumber
Konvensi penamaan seperti ini berguna ketika Anda membaca kode, terutama kode yang bukan milik Anda. Konvensi penamaan yang kuat membantu menunjukkan di mana anggota tertentu didefinisikan, apa jenis anggotanya, dll. Sebagian besar tim pengembangan mengadopsi konvensi penamaan yang sederhana, dan hanya awalan bidang anggota dengan garis bawah (
_fieldName
). Di masa lalu, saya telah menggunakan konvensi penamaan berikut untuk C # (yang didasarkan pada konvensi Microsoft untuk .NET framework code, yang dapat dilihat dengan Reflector):Bidang Instans: m_fieldName
Bidang Statis: s_fieldName
Publik / Dilindungi / Anggota Internal: PascalCasedName ()
Anggota Pribadi: camelCasedName ()
Ini membantu orang memahami struktur, penggunaan, aksesibilitas, dan lokasi anggota saat membaca kode asing dengan sangat cepat.
sumber