PEMBARUAN PENTING (12 April 2016):
Kami memperhatikan bahwa standar internal tim .NET CoreFX bersikeras menggunakan notasi garis bawah tanpa memberikan wawasan mengapa. Namun jika kita melihat secara dekat aturan # 3 menjadi jelas bahwa ada sistem _, t_, s_prefiks yang menyarankan mengapa _dipilih di tempat pertama.
- Kami menggunakan
_camelCaseuntuk bidang internal dan pribadi dan menggunakan hanya baca jika memungkinkan. Awali bidang contoh dengan _, bidang statis dengan s_dan utas bidang statis dengan t_. Ketika digunakan pada bidang statis, readonlyharus datang setelahnya static(yaitu static readonlytidak readonly static).
- Kami menghindari
this.kecuali benar-benar diperlukan.
Jadi jika Anda seperti tim .NET CoreFX yang mengerjakan beberapa kode level sistem yang kritis, multithreaded, kinerja , maka SANGAT DISARANKAN agar Anda:
- mematuhi standar pengkodean dan
- gunakan notasi garis bawah dan
- jangan baca jawaban ini lebih jauh
Kalau tidak silakan baca terus ...
JAWABAN ASLI:
Pertama-tama mari kita sepakat tentang apa yang kita bicarakan. Pertanyaannya adalah bagaimana kita mengakses anggota instance dari dalam metode dan konstruktor non-statis kelas / sub-kelas jika pengubah visibilitas memungkinkan melakukannya.
Notasi garis bawah
- menyarankan agar Anda menggunakan awalan "_" dalam nama bidang pribadi
- itu juga mengatakan bahwa Anda tidak boleh menggunakan "ini" kecuali jika benar-benar diperlukan
Notasi ini
- menunjukkan bahwa Anda selalu menggunakan "ini." untuk mengakses anggota instance
Mengapa notasi ini ada?
Karena ini adalah bagaimana Anda
- pisahkan parameter dari bidang saat mereka berbagi nama yang sama
- pastikan Anda bekerja dalam konteks instance saat ini
Contoh
public class Demo
{
private String name;
public Demo(String name) {
this.name = name;
}
}
Mengapa notasi garis bawah itu ada?
Beberapa orang tidak suka mengetik "ini", tetapi mereka masih membutuhkan cara untuk membedakan bidang dan parameter, jadi mereka setuju untuk menggunakan "_" di depan bidang
Contoh
public class Demo
{
private String _name;
public Demo(String name) {
_name = name;
}
}
Orang mungkin berpikir itu hanya masalah selera pribadi dan keduanya sama-sama baik / buruk. Namun ada beberapa aspek di mana notasi ini mengalahkan notasi garis bawah:
Kejelasan
- menggarisbawahi-notasi nama clutters
- notasi ini membuat nama tetap utuh
Beban kognitif
notasi garis bawah tidak konsisten, itu membuat Anda memperlakukan bidang dengan cara khusus, tetapi Anda tidak dapat menggunakannya dengan anggota lain, setiap kali Anda perlu bertanya pada diri sendiri apakah Anda memerlukan properti atau bidang
notasi ini konsisten, Anda tidak perlu berpikir, Anda selalu menggunakan "ini" untuk merujuk ke anggota mana pun
PEMBARUAN: seperti yang ditunjukkan berikut ini bukan poin keuntungan
Pemeliharaan
notasi garis bawah mengharuskan Anda untuk mengawasi _saat melakukan refactoring, katakanlah mengubah bidang menjadi properti (hapus _) atau sebaliknya (tambahkan _)
notasi ini tidak memiliki masalah seperti itu
Pelengkapan otomatis
Ketika Anda perlu melihat daftar anggota contoh:
- notasi garis bawah tidak banyak membantu Anda, karena ketika Anda mengetik "_" popup autocomplete menunjukkan kepada Anda bidang pribadi dan semua jenis yang tersedia dari rakitan tertaut yang dicampur dengan anggota instance lainnya
- notasi ini memberi Anda jawaban yang jelas, dengan mengetik "ini" yang Anda lihat hanyalah daftar anggota dan tidak ada yang lain
Kemenduaan
Terkadang Anda harus berurusan dengan kode tanpa bantuan Intellisense. Misalnya ketika Anda melakukan review kode atau menelusuri kode sumber online.
underscore-notation adalah ambigu: Ketika Anda melihat Sesuatu. Sesuatu yang Anda tidak dapat mengatakan apakah Sesuatu adalah kelas dan SomethingElse adalah properti statisnya ... atau mungkin Sesuatu adalah properti instance saat ini yang memiliki properti sendiri dari SomethingElse
ini-notasi jelas: Ketika Anda melihat Sesuatu. Sesuatu Itu hanya dapat berarti kelas dengan properti statis dan ketika Anda melihat ini. Sesuatu. Sesuatu yang Anda tahu bahwa Sesuatu adalah anggota dan SesuatuElse adalah miliknya
Metode penyuluhan
Anda tidak dapat menggunakan metode ekstensi pada instance itu sendiri tanpa menggunakan "ini."
- garis bawah-notasi mengharuskan Anda tidak menggunakan "ini", namun dengan metode ekstensi Anda harus
- notasi ini menyelamatkan Anda dari keragu-raguan, Anda selalu menggunakan "ini", titik.
Dukungan Visual Studio
Rekomendasi resmi
Ada banyak pedoman resmi yang dengan jelas mengatakan "jangan gunakan garis bawah" terutama di C #