Untuk menggarisbawahi atau untuk tidak menggarisbawahi, itulah pertanyaannya


131

Apakah ada masalah dengan tidak mengawali bidang pribadi dengan garis bawah dalam C # jika versi biner akan dikonsumsi oleh bahasa kerangka kerja lain? Misalnya karena C # peka huruf besar kecil, Anda dapat memanggil bidang "foo" dan properti publik "Foo" dan berfungsi dengan baik.

Akan ini setiap efek pada bahasa case-sensitive seperti VB.NET, akan ada oleh CLS-kepatuhan (atau lainnya) masalah jika nama hanya dibedakan oleh casing?


18
Inti dari awalan garis bawah, BTW, bukan untuk menangani masalah kasus. Untuk dapat membedakan bidang dan penduduk setempat dengan mudah dan visual saat membaca kode. Saya akan menggunakannya dalam C # dan VB sama.
Neil Hewitt

2
@NeilHewitt: Ya, itu juga mencegah parameter fungsi dari konflik dengan variabel anggota, yang memerlukan prepending masing-masing dengan this, yang menyebalkan. EDIT: Saya baru saja menanggapi komentar empat tahun ...
Ed S.

Hanya untuk kejelasan standar resmi _camelCase(disukai saja) github.com/dotnet/corefx/blob/master/Documentation/…
Chris Marisic

Saya lebih suka _camelCase untuk toko dukungan pribadi. yaitu: file pribadi yang menyimpan data yang ditugaskan dan diakses melalui properti. Saya tidak suka properti otomatis karena mereka tidak dapat diinisialisasi ke nilai yang diketahui dalam definisi kelas, dan jika saya ingin efek samping dalam setter, saya perlu toko dukungan yang dinyatakan secara eksplisit. Sayangnya, ini menjadi refactored ketika saya menggunakan ^ R ^ E di editor c #, jadi saya harus menambahkannya kembali ... setiap kali.
TomXP411

Jawaban:


47

Ini akan memiliki tidak berpengaruh.

Bagian dari rekomendasi untuk menulis perpustakaan yang memenuhi CLS adalah untuk TIDAK memiliki dua entitas publik / dilindungi yang berbeda hanya dengan kasus misalnya Anda TIDAK harus memiliki

public void foo() {...}

dan

public void Foo() {...}

apa yang Anda gambarkan bukan masalah karena item pribadi tidak tersedia untuk pengguna perpustakaan


1
Meskipun tidak akan ada efek, itu tetap sebuah konvensi yang membuat saya tidak nyaman - karena ini adalah resep untuk kebingungan jika mereka hanya berbeda berdasarkan kasus. Terlalu mudah untuk salah baca atau salah ketik jika satu-satunya perbedaan adalah modal awal.
ChrisA

2
PS Secara pribadi, saya tidak menggarisbawahi dalam C #. Bagi saya itu adalah pilihan pribadi, bukan keyakinan agama
Binary Worrier

1
Saya telah melakukan kedua cara dan saya ingin mengambil keputusan, satu dan untuk semua, berdasarkan pengetahuan: P
TheCodeJunkie

46
Saya menggunakan garis bawah. Lebih mudah untuk membedakan mereka dari argumen dan variabel lokal.
Rinat Abdullin

4
Saya menggunakan _ hanya untuk bidang pribadi, namun saya hampir tidak pernah memiliki bidang pribadi karena 3,5 properti otomatis. Umumnya satu-satunya waktu saya memiliki bidang pribadi adalah jika saya menerapkan pemuatan malas pada tipe non-primitif.
Chris Marisic

279

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.

  1. 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).
  2. 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

  • garis bawah-notasi tidak memiliki dukungan bawaan di Visual Studio
  • notasi ini didukung oleh Visual Studio secara alami:

    1. "Ini." Kualifikasi : Memilih semua bidang non-statis yang digunakan dalam metode non-statis untuk diawali dengan this.dalam C #

Rekomendasi resmi

Ada banyak pedoman resmi yang dengan jelas mengatakan "jangan gunakan garis bawah" terutama di C #


22
Ini jawaban yang luar biasa. Terima kasih telah meluangkan waktu untuk mengkompilasi semua informasi ini.
Tigran

5
Tidak berasal dari C ++, karena dalam C ++ pengidentifikasi cadangan dimulai dengan garis bawah untuk penggunaan bahasa dan perpustakaan standar.
Rob G

7
Mengapa Anda membedakan antara kritis kinerja, multithreaded, kode tingkat sistem dan kode lainnya? Bagaimana menggunakan _camelCaseakan membantu saya jika kode saya adalah kode tingkat sistem / kinerja kritis?
BornToCode

6
Menggunakan garis bawah tidak ada hubungannya dengan penulisan kode kritis, multi-utas atau sistem-tingkat kinerja. Ini adalah konsistensi yang penting dan tim CoreFX hanyalah tim yang menyetujui konvensi tertentu. Ini adalah jawaban yang bagus, didukung dengan analisis yang sangat bagus membandingkan konvensi penamaan tetapi saya yakin bagian tambahan mengatakan "garis bawah lebih baik karena tim CoreFX berkata begitu" benar-benar menurunkan kualitasnya.
Şafak Gür

5
Masalah saya adalah saya mengerti kesimpulan logis. en.wikipedia.org/wiki/Inference Tapi hei, saya mengerti itu bukan untuk semua orang.
user603563

67

Diambil dari file Bantuan Microsoft StyleCop:

TypeName: FieldNamesMustNotBeginWithUnderscore

CheckId: SA1309

Penyebab: Nama bidang dalam C # dimulai dengan garis bawah.

Deskripsi Aturan:

Pelanggaran aturan ini terjadi ketika nama bidang dimulai dengan garis bawah.

Secara default, StyleCop melarang penggunaan garis bawah, m_, dll., Untuk menandai bidang kelas lokal, mendukung 'ini.' awalan. Keuntungan menggunakan 'ini.' adalah bahwa ia berlaku sama untuk semua jenis elemen termasuk metode, properti, dll., dan bukan hanya bidang, membuat semua panggilan ke anggota kelas langsung dikenali, terlepas dari editor mana yang digunakan untuk melihat kode. Keuntungan lain adalah ia menciptakan diferensiasi yang cepat dan dapat dikenali antara anggota instance dan anggota statis, yang tidak akan diawali sebelumnya.

Jika bidang atau nama variabel dimaksudkan untuk cocok dengan nama item yang terkait dengan Win32 atau COM, dan dengan demikian perlu dimulai dengan garis bawah, letakkan bidang atau variabel dalam kelas NativeMethods khusus. Kelas NativeMethods adalah kelas apa pun yang berisi nama yang diakhiri dengan NativeMethods, dan dimaksudkan sebagai pengganti untuk pembungkus Win32 atau COM. StyleCop akan mengabaikan pelanggaran ini jika item ditempatkan dalam kelas NativeMethods.

Deskripsi aturan yang berbeda menunjukkan bahwa praktik yang disukai selain yang di atas adalah memulai bidang pribadi dengan huruf kecil, dan yang umum dengan huruf besar.

Sunting: Sebagai tindak lanjut, halaman proyek StyleCop berada di sini: https://github.com/DotNetAnalyzers/StyleCopAnalyzers . Membaca melalui file bantuan memberi banyak wawasan tentang mengapa mereka menyarankan berbagai aturan gaya.


7
Sebagian besar jenis "praktik terbaik". Seperti yang dinyatakan oleh aturan, awalan dengan "ini" dapat diterapkan ke anggota non-statis sementara awalan dengan hal lain mungkin tidak dapat diterapkan karena aturan sintaksis bahasa. Kata kunci "ini" membuat tujuan yang dituju sepele.
Scott Dorman

5
Saya juga mendukung solusi yang dimaksudkan bahasa untuk masalah ("ini") daripada cara-cara buatan untuk mengatasinya.
galaktor

10
Ada juga aturan dalam perangkat lunak yang sama yang mengatakan Anda tidak boleh memiliki dua bidang yang berbeda hanya dalam kasus. Jadi apa yang Anda lakukan dengan variabel yang dilindungi yang dibungkus oleh properti publik?
Sungai Lilith

5
Satu-satunya masalah saya dengan hal 'no garis bawah' adalah bahwa ketika pemrograman terhadap Formulir (web) atau semacamnya, hanya menggunakan 'ini' tidak membantu saya sama sekali menyaring ke bidang-bidang pribadi yang telah saya tetapkan dan sebaliknya hanya memberi saya daftar delapan juta properti lainnya yang termasuk dalam objek raksasa itu.

14
StyleCop tampaknya mengatakan bahwa, jika saya secara konsisten menggunakan thisketika merujuk ke anggota kelas mana pun, saya dapat menemukan semua panggilan ke semua anggota kelas hanya dengan mencari this. Saya tidak bisa berdebat dengan itu, tetapi saya juga tidak bisa memikirkan waktu di mana saya perlu melakukan itu. Hal terakhir yang ingin saya lakukan adalah menambahkan kebosanan untuk pengkodean dan sampah kode saya this(yang hampir Hungaria) untuk hampir tidak ada keuntungan praktis. Faktanya adalah, jika saya melihat satu baris kode, apa pun yang dimulai dengan huruf kapital atau garis bawah adalah anggota kelas, apa pun huruf kecilnya adalah lokal.
devuxer

27

Karena kita berbicara tentang bidang pribadi, itu tidak memengaruhi pengguna kelas Anda.

Tetapi saya sarankan menggunakan garis bawah untuk bidang pribadi, karena dapat membuat kode lebih mudah dipahami, misalnya:

private int foo;
public void SetFoo(int foo)
{
  // you have to prefix the private field with "this."
  this.foo = foo;

  // imagine there's lots of code here,
  // so you can't see the method signature



  // when reading the following code, you can't be sure what foo is
  // is it a private field, or a method-argument (or a local variable)??
  if (foo == x)
  {
    ..
  }
}

Di tim kami, kami selalu menggunakan awalan garis bawah untuk bidang pribadi. Jadi ketika membaca beberapa kode, saya dapat dengan mudah mengidentifikasi bidang pribadi dan membedakannya dari penduduk setempat dan argumen. Di satu sisi, garis bawah dapat dilihat sebagai versi singkat "ini."


14
Yah saya selalu awalan dengan 'ini' tidak masalah jika saya menerima bidang, properti atau metode.
TheCodeJunkie

9
Bagi saya, garis bawah adalah semacam notasi singkat "ini."
M4N

2
Dalam R #, sarannya adalah untuk tidak memanggil parameter foo. Mengapa tidak menyebutnya 'nilai' karena Anda tahu itu akan digunakan untuk Set Foo?
thinkbeforecoding

17
@ Martin: Masalah dengan garis bawah sebagai singkatan untuk "ini" adalah bahwa hal itu tidak selalu dapat diterapkan ke semua anggota kelas sementara "ini" bisa. Saya pikir kodenya lebih mudah dibaca / bersih dengan kata kunci "ini". Dalam contoh Anda, if (foo == x) akan selalu merujuk ke parameter foo.
Scott Dorman

3
@TheCodeJunkie: Itu banyak sekali karakter yang berlebihan dalam basis kode Anda.
Ed S.

15

Setelah bekerja di lingkungan yang memiliki aturan gaya yang sangat spesifik dan sangat tidak berarti sejak saat itu saya terus menciptakan gaya saya sendiri. Ini adalah salah satu jenis yang saya bolak-balik pada banyak. Saya akhirnya memutuskan bahwa bidang pribadi akan selalu menjadi _field, variabel lokal tidak akan pernah memiliki _ dan akan menjadi huruf kecil, nama variabel untuk kontrol akan secara longgar mengikuti notasi Hongaria, dan parameter umumnya akan menjadi camelCase.

Saya benci this.kata kunci itu hanya menambahkan terlalu banyak suara kode menurut pendapat saya. Saya suka Resharper menghapus ini berlebihan. kata kunci.

Pembaruan 6 tahun: Saya menganalisis internal Dictionary<TKey,T>untuk penggunaan khusus akses bersamaan dan salah membaca bidang pribadi sebagai variabel lokal. Bidang pribadi seharusnya tidak boleh berupa konvensi penamaan yang sama dengan variabel lokal. Jika ada garis bawah, itu akan sangat jelas.


18
Kata thiskunci adalah referensi yang dijamin ke objek saat ini. Anda tidak mendapatkan itu dengan garis bawah. Tidak perlu dibenci this.
Jason S

15
Mengapa menciptakan 'standar'. 'ini.' memberi tahu Anda bahwa objek adalah variabel instan 'Kelas.' memberitahu Anda itu adalah variabel kelas. Yang lainnya adalah variabel stack. Garis bawah berada di tumpukan gagasan buruk yang sama dengan Notasi Hongaria yang sekarang terurai.
Quarkly

4
@ DRAirey1 terlalu mudah untuk melewatkan ini. ketika Anda membutuhkannya dan Anda akhirnya melakukan hal-hal aneh dengan keadaan.
Chris Marisic

3
@ChrisMarisic Anda tentu saja dipersilakan untuk pendapat Anda tentang penggunaan _, tetapi jangan menganggapnya sebagai standar yang ditetapkan ketika jelas tidak.
naksir

3
Aku kehilangan kamu di "Aku pergi untuk menciptakan gayaku sendiri".
rory.ap

12

Saya suka garis bawah, karena saya dapat menggunakan nama huruf kecil sebagai parameter metode seperti ini:

public class Person
{
    string _firstName;

    public MyClass(string firstName)
    {
        _firstName = firstName;
    }

    public string FirstName
    {
        get { return _firstName; }
    }
}

39
public string FirstName {get; set pribadi; }
jason

3
Anda masih bisa menggunakan huruf kecil sebagai parameter metode, dengan menggunakan thiskata kunci. Menjadikannya sebagai titik bisu yang terus-menerus dan selalu kontroversial "menggarisbawahi atau tidak":public MyClass(string firstName){ this.firstName = firstName; }
mateuscb

5
Ini adalah masa depan, sekarang adil public string FirstName { get; }dan setter masih tersedia di konstruktor
Chris Marisic

Dalam contoh ini. thishanya akan diperlukan dalam konstruktor. Tidak perlu menggunakannya di tempat lain. Sehingga firstNamenama field berfungsi dengan sangat baik.
Thomas Eyde

9

Saya masih sangat suka menggunakan garis bawah di depan bidang pribadi karena alasan yang disebutkan Martin, dan juga karena bidang pribadi kemudian akan diurutkan bersama di IntelliSense. Ini terlepas dari kejahatan notasi awalan Hongaria secara umum.

Namun, belakangan ini saya menemukan bahwa menggunakan awalan garis bawah untuk anggota pribadi tidak disukai, meskipun saya tidak yakin mengapa. Mungkin orang lain tahu? Apakah itu hanya prinsip awalan? Atau apakah ada sesuatu yang terlibat dengan pencabutan nama tipe generik yang mendapat garis bawah di dalamnya dalam kumpulan yang dikompilasi atau sesuatu?


4
Bagi saya _ clutters up _words ketika dengan cepat _scanning melalui kode, menjadi kurang seperti hanya membaca _and _more _like harus berhenti di _every _ untuk mengakuinya dan _realize itu _ bukan karakter kontrol dari beberapa _sort. Ini juga mengganggu indentasi dengan mendorong karakter berguna pertama dalam nama bidang satu kolom ke kanan. Saya biasanya tidak suka C ++ karena kebanyakan C ++ - programmer cenderung menulis simbol yang sangat singkat dan lambat untuk dibaca / kode seperti mesin dan saya lebih suka tidak memiliki kode C # :)
Oskar Duveborn

23
Bagi saya, ini. mengacaukan this.words ketika cepat this.scanning melalui kode, menjadi kurang seperti hanya membaca ini. dan ini. lebih lanjut ini. seperti harus berhenti dan ini. setiap ini. untuk mengakuinya dan ini. Realisasikan ini ini. bukan karakter kontrol dari beberapa this.sort. Saya lebih suka menemukan sesekali _fieldFooatau _fieldBardaripada memiliki penggunaan saya berantakan dengan this.fieldFooatau this.fieldBar. Saya menemukan this.awalan jauh lebih menggelegar daripada garis bawah terkemuka.
AggieEric

Saya berpikir mungkin perbedaan dalam pengalaman ini mungkin berasal dari sistem file oldschool atau protokol transfer file di mana spasi tidak diizinkan yang melatih beberapa pengguna untuk melihat garis bawah sebagai spasi dan karenanya tidak mengganggu pembacaan mereka. Saya di sisi lain memiliki masalah dengan nama file seperti itu karena saya selalu menggunakan spasi di nama file saya sendiri sejak awal ...
Oskar Duveborn

1
@AggieEric memukul paku di kepala sana. Hanya membaca kalimatnya membuatku sakit kepala! Saya mencoba untuk tetap berpegang pada rekomendasi MS selama bertahun-tahun dalam masalah ini, dan saya jadi SAKIT membaca thiskata-kata biru kecil di mana-mana, saya membuat keputusan aneh di sana. Sekarang, saya secara agama hanya menggunakan thisreferensi properti SAJA, atau ketika saya perlu secara eksplisit membedakan antara thisdan base. Masing-masing untuk dirinya sendiri, saya kira :-)
Riegardt Steyn

1
Saya pikir itu karena, pada akhirnya, memulai sesuatu dengan karakter tanda baca menyakitkan keterbacaan. Tampaknya tidak mengganggu semua orang tetapi bagi saya rasanya sangat tidak wajar membaca apa pun yang dimulai dengan tanda baca. Semakin mirip kode bahasa Inggrisnya, semakin mudah saya menemukannya untuk dibaca. Dan dengan IDE modern, sangat mudah untuk mengetahui perbedaan antara penduduk lokal dan anggota pribadi karena mereka kemungkinan besar akan warna yang berbeda.
Tim Long

5

Rekomendasi Gaya Cop atau tidak, menggali ke dalam .NET Framework menunjukkan banyak penggunaan "_" untuk variabel anggota. Apa pun yang direkomendasikan oleh pencipta Style Cop, itu bukan yang digunakan sebagian besar karyawan MS. :) Jadi saya akan tetap dengan garis bawah. Karena saya pribadi membuat kesalahan jauh lebih sedikit menggunakan garis bawah maka ini (contoh: menggunakan varName = varName, bukan this.varName = varName, itu benar-benar terjebak dalam diriku)


3
Garis bawah juga disarankan untuk panduan gaya inti .NET: github.com/dotnet/corefx/wiki/Coding-style
landoncz

3

Saya pikir pada umumnya bidang tingkat kelas adalah kesalahan dalam desain bahasa. Saya lebih suka jika properti C # memiliki cakupan lokal sendiri:

public int Foo
{
   private int foo;
   get
   {
      return foo;
   }
   set
   {
      foo = value;
   }
}

Itu akan memungkinkan untuk berhenti menggunakan bidang sepenuhnya.

Satu-satunya saat saya awalan bidang pribadi dengan garis bawah adalah ketika properti membutuhkan bidang dukungan yang terpisah. Itu juga satu-satunya saat saya menggunakan bidang pribadi. (Dan karena saya tidak pernah menggunakan bidang yang dilindungi, internal, atau publik, itu satu-satunya saat saya menggunakan periode bidang.) Sejauh yang saya ketahui, jika variabel perlu memiliki ruang lingkup kelas, itu adalah properti dari kelas.


Geng C # tampaknya setuju dengan Anda dengan int foo pribadi baru (dapatkan; set;} gula sintaks.
Dana

Oh tentu saja; apa yang saya jelaskan di sini benar-benar tidak bisa dijalankan tanpa itu.
Robert Rossney

Yang Anda gambarkan adalah "Properti yang diimplementasikan otomatis". Sayangnya, dengan Visual Basic.NET, ini benar-benar menggunakan variabel _prefix "tersembunyi" di belakang layar yaitu jika Anda memiliki properti auto-implemented "Public Property Foo As Integer", maka Anda TIDAK dapat memiliki deklarasi variabel anggota "Private _foo as Integer "

Tidak, saya tidak menjelaskan properti yang diimplementasikan secara otomatis, setidaknya tidak dalam contoh saya. Saya menjelaskan tingkat pelingkupan yang tidak ada di C # atau VB. Sangat disayangkan bahwa VB memilih cara sepele seperti itu untuk menyumbat nama bidang dukungan. C # cukup jelek sehingga Anda tidak akan pernah membuat variabel dengan nama yang sama secara tidak sengaja.
Robert Rossney

3

Notasi _fieldName untuk bidang pribadi sangat mudah dipecahkan . Menggunakan "ini." Notasi tidak mungkin dipatahkan. Bagaimana Anda memecahkan notasi _? Mengamati:

private void MyMethod()
{
  int _myInt = 1; 
  return; 
}

Ini dia, saya baru saja melanggar konvensi penamaan Anda tetapi kompilasi. Saya lebih suka memiliki konvensi penamaan yang a) tidak hungaria dan b) eksplisit. Saya mendukung penghapusan penamaan Hongaria dan ini memenuhi syarat. Alih-alih jenis objek di depan nama variabel Anda memiliki tingkat aksesnya.

Bandingkan ini dengan Ruby di mana nama variabel @my_numbermengikat nama ke dalam cakupan dan tidak bisa dipecahkan.

sunting: Jawaban ini sudah negatif. Saya tidak peduli, tetap saja.


11
Ini bukan kritik yang valid dari konvensi penamaan untuk mengatakan bahwa mungkin bagi pengembang untuk tidak mengikutinya.
Robert Rossney

8
Wow, definisi Anda tentang "mudah dihancurkan" dan definisi saya adalah, sangat bertentangan. Milik Anda berarti "mudah untuk istirahat dengan sengaja," sementara kebanyakan orang lain mungkin berarti "mudah untuk istirahat secara tidak sengaja ." Saya akan meninggalkannya sebagai latihan untuk pembaca untuk mencari tahu mana yang lebih relevan dalam menulis kode yang dapat dibaca ...
Konrad Rudolph

6
@Konrad: Anda terdengar sok ketika Anda mengatakan "sebagai latihan untuk pembaca". Ini bukan buku teks matematika.
jcollum

3
Sedikit kurang negatif sekarang :) Sementara kita mungkin mendayung melawan arus, saya juga tidak suka konvensi garis bawah. Dalam pandangan saya itu tidak berbeda dengan notasi Hongaria dan jujur, itu membuat mata saya berdarah (sakit keterbacaan). Kami membuang Notasi Hongaria dengan C # dan sudah waktunya untuk memotong sisa terakhir ini karena tidak mempercayai IDE Anda.
Tim Long

1
Saya mendengar bahwa MS sebenarnya mengatakan bahwa garis bawah tidak boleh digunakan dalam panduan gaya C #. blogs.msdn.microsoft.com/brada/2005/01/26/… - bagian 2.6 - sepertinya Brad Abrams setidaknya setuju dengan kami!
jcollum

1

Saat Anda ingin agar perakitan Anda sesuai dengan CLS, Anda dapat menggunakan atribut CLSCompliant dalam file assemblyinfo Anda. Compiler kemudian akan mengeluh ketika kode Anda mengandung hal-hal yang tidak sesuai dengan cls.

Kemudian, ketika Anda memiliki 2 properti yang hanya berbeda dalam kasus, kompiler akan mengeluarkan kesalahan. Di sisi lain, ketika Anda memiliki bidang pribadi dan properti publik di kelas yang sama, tidak akan ada masalah.

(Tapi, saya juga selalu awali anggota pribadi saya dengan garis bawah. Ini juga membantu saya untuk memperjelas ketika saya membaca kode saya bahwa variabel tertentu adalah bidang anggota).


0

Saya suka menggunakan garis bawah di depan bidang pribadi saya karena dua alasan. Satu telah disebutkan, bidang menonjol dari properti terkait dalam kode dan Intellisense. Alasan kedua adalah bahwa saya dapat menggunakan konvensi penamaan yang sama apakah saya sedang mengkode dalam VB atau C #.


1
whoah, apakah itu bijaksana? Bukankah garis bawah berarti 'melanjutkan di baris berikutnya' di VB?
JBRWilkinson

1
Hanya jika garis bawah diikuti oleh spasi.
Rob Windsor

Huruf awal menjadi huruf kecil atau huruf besar menonjol bagi saya :)
ManoDestra

0

Tidak ada implikasi apa pun. Ketika kode Anda dikompilasi, semua yang penting bagi kompiler adalah bidang dan visibilitas bidang / properti. Garis bawah sama pentingnya dengan karakter lain saat menamai pengidentifikasi. Trik sebenarnya adalah menggunakan konvensi yang Anda dan orang-orang di sekitar Anda akan mengerti.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.