Versi 6.0 mendapat fitur baru nameof
, tetapi saya tidak dapat memahami tujuannya, karena hanya mengambil nama variabel dan mengubahnya ke string pada kompilasi.
Saya pikir itu mungkin memiliki beberapa tujuan ketika menggunakan <T>
tetapi ketika saya mencoba nameof(T)
hanya mencetak sayaT
bukan tipe yang digunakan.
Ada ide tentang tujuannya?
T
sebelumnya. Ada cara untuk mendapatkan jenis yang digunakan sebelumnya.nameof
. Juga membantu mencegah kesalahan ketik.Jawaban:
Bagaimana dengan kasus-kasus di mana Anda ingin menggunakan kembali nama properti, misalnya saat melempar pengecualian berdasarkan nama properti, atau menangani suatu
PropertyChanged
peristiwa. Ada banyak kasus di mana Anda ingin memiliki nama properti.Ambil contoh ini:
Dalam kasus pertama, penggantian nama
SomeProperty
akan mengubah nama properti, atau akan merusak kompilasi. Kasus terakhir tidak.Ini adalah cara yang sangat berguna untuk menjaga kompilasi kode Anda dan bebas bug (sort-of).
(Artikel yang sangat bagus dari Eric Lippert mengapa
infoof
tidak membuatnya, sementaranameof
itu)sumber
nameof
dan nama tindakan alih-alih string yang dikodekan keras.public class MyController { public ActionResult Index() { return View(nameof(Index)); } }
- dan Anda dapat menggunakannameof
anggota non-statis (misalnya Anda dapat memanggilnameof(MyController.Index)
menggunakan kelas di atas dan itu akan mengeluarkan "Indeks"). Lihatlah contoh-contohnya di msdn.microsoft.com/en-us/library/…Ini sangat berguna untuk
ArgumentException
dan turunannya:Sekarang jika seseorang refactor nama
input
parameter, pengecualian akan selalu diperbarui.Ini juga berguna di beberapa tempat di mana refleksi sebelumnya harus digunakan untuk mendapatkan nama properti atau parameter.
Dalam contoh Anda
nameof(T)
mendapatkan nama parameter tipe - ini dapat berguna juga:Penggunaan lain
nameof
adalah untuk enum - biasanya jika Anda ingin nama string enum yang Anda gunakan.ToString()
:Ini sebenarnya relatif lambat karena .Net memegang nilai enum (yaitu
7
) dan menemukan nama pada saat run time.Alih-alih gunakan
nameof
:Sekarang .Net menggantikan nama enum dengan string pada waktu kompilasi.
Namun kegunaan lain adalah untuk hal-hal seperti
INotifyPropertyChanged
dan masuk - dalam kedua kasus Anda ingin nama anggota yang Anda panggil diteruskan ke metode lain:Atau...
sumber
typeof(T)
, yang merupakan bagian lain dari waktu kompilasi gula yang berguna dalam situasi yang sama :-)nameofthismethod
. Anda dapat menggunakanLog.Error($"Error in {nameof(DoSomething)}...")
tetapi jika Anda menyalin-menempel ini ke metode lain Anda tidak akan melihat bahwa itu masih mengacu padaDoSomething
. Jadi sementara itu bekerja dengan sempurna dengan variabel atau parameter lokal, nama metode adalah masalah.nameOf
akan menggunakan[DisplayName]
atribut jika ada? Sebagaienum
contoh saya[DisplayName]
sering menggunakan proyekthrow new
adalah anti-pola lain - saya menemukan penggunaan berlebihancatch
menjadi masalah umum dengan junior devs karena rasanya seperti memperbaiki masalah (ketika sebagian besar waktu hanya menyembunyikannya).Kasus penggunaan lain di mana
nameof
fitur C # 6.0 menjadi praktis - Pertimbangkan perpustakaan seperti Dapper yang membuat pengambilan DB jauh lebih mudah. Meskipun ini adalah pustaka yang hebat, Anda perlu meng-hardcode nama properti / bidang dalam kueri. Ini artinya bahwa jika Anda memutuskan untuk mengubah nama properti / bidang Anda, ada kemungkinan besar Anda akan lupa memperbarui kueri untuk menggunakan nama bidang baru. Dengan interpolasi string dannameof
fitur, kode menjadi lebih mudah dipelihara dan disimpan dengan aman.Dari contoh yang diberikan dalam tautan
tanpa nama
dengan nama
sumber
Pertanyaan Anda sudah menyatakan tujuannya. Anda harus melihat ini mungkin berguna untuk mencatat atau melempar pengecualian.
sebagai contoh.
ini bagus, jika saya mengubah nama variabel, kode akan rusak atau mengembalikan pengecualian dengan pesan yang salah .
Tentu saja, penggunaannya tidak terbatas pada situasi sederhana ini. Anda dapat menggunakan
nameof
kapan saja akan berguna untuk kode nama variabel atau properti.Penggunaannya bermacam-macam ketika Anda mempertimbangkan berbagai situasi ikatan dan refleksi. Ini cara yang sangat baik untuk membawa kesalahan waktu menjalankan untuk mengkompilasi waktu.
sumber
OnPropertyChanged
metode kustom (yang langsung menerima nama properti daripadaPropertyChangedEventArgs
), atau panggilan untuk refleksi untuk mencari tertentu anggota atau tipe?Kasus penggunaan paling umum yang dapat saya pikirkan adalah ketika bekerja dengan
INotifyPropertyChanged
antarmuka. (Pada dasarnya semua yang terkait dengan WPF dan binding menggunakan antarmuka ini)Lihatlah contoh ini:
Seperti yang Anda lihat dengan cara lama, kami harus memberikan string untuk menunjukkan properti mana yang telah berubah. Dengan
nameof
kita dapat menggunakan nama properti secara langsung. Ini mungkin bukan masalah besar. Tapi bayangkan apa yang terjadi ketika seseorang mengubah nama propertiFoo
. Saat menggunakan string, binding akan berhenti bekerja, tetapi kompiler tidak akan memperingatkan Anda. Saat menggunakan nameof Anda mendapatkan kesalahan kompiler bahwa tidak ada properti / argumen dengan namaFoo
.Perhatikan bahwa beberapa kerangka kerja menggunakan beberapa sihir refleksi untuk mendapatkan nama properti, tetapi sekarang kita memiliki nama ini tidak lagi diperlukan .
sumber
[CallerMemberName]
atribut pada param metode baru untuk meningkatkan peristiwa ini.[CallerMemberName]string x = null
lebih baik darinameof(Property)
. Anda bisa mengatakan nama properti digunakan dua kali, tetapi pada dasarnya argumen itu dilewatkan ke fungsi. Tidak benar-benar apa yang dimaksud dengan KERING saya pikir :).nameof
adalah bahwa setter properti tidak perlu menentukan nama properti sama sekali, menghilangkan kemungkinan bug copy / paste.INotifyPropertyChanged
, menggunakan[CallerMemberNameAttribute]
memungkinkan notifikasi perubahan dibesarkan dengan bersih dari setter properti, sementaranameof
sintaks memungkinkan notifikasi perubahan dibangkitkan secara bersih dari lokasi yang berbeda dalam kode Anda.Penggunaan paling umum adalah validasi input, seperti
Dalam kasus pertama, jika Anda refactor metode mengubah nama parameter par , Anda mungkin akan lupa untuk mengubahnya di ArgumentNullException . Dengan nama Anda tidak perlu khawatir tentang itu.
Lihat juga: nameof (C # dan Visual Basic Reference)
sumber
Proyek ASP.NET Inti MVC menggunakan
nameof
dalamAccountController.cs
danManageController.cs
denganRedirectToAction
metode untuk referensi tindakan dalam controller.Contoh:
Ini diterjemahkan menjadi:
dan mengambil membawa pengguna ke tindakan 'Indeks' di controller 'Rumah', yaitu
/Home/Index
.sumber
return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Substring(nameof(HomeController),0,nameof(HomeController).Length-"Controller".Length));
?Seperti yang telah ditunjukkan orang lain,
nameof
operator memasukkan nama elemen yang diberikan dalam kode sumber.Saya ingin menambahkan bahwa ini adalah ide yang sangat bagus dalam hal refactoring karena membuat string ini refactoring aman. Sebelumnya, saya menggunakan metode statis yang menggunakan refleksi untuk tujuan yang sama, tetapi itu memiliki dampak kinerja runtime. The
nameof
Operator tidak memiliki dampak kinerja runtime; itu bekerja pada waktu kompilasi. Jika Anda melihatMSIL
kode Anda akan menemukan string yang tertanam. Lihat metode berikut dan kode yang dibongkar.Namun, itu bisa menjadi kelemahan jika Anda berencana untuk mengaburkan perangkat lunak Anda. Setelah kebingungan, string yang disematkan mungkin tidak lagi cocok dengan nama elemen. Mekanisme yang bergantung pada teks ini akan pecah. Contoh untuk itu, termasuk tetapi tidak terbatas pada adalah: Refleksi, NotifyPropertyChanged ...
Menentukan nama selama runtime membutuhkan kinerja, tetapi aman untuk kebingungan. Jika kebingungan tidak diperlukan atau direncanakan, saya akan merekomendasikan menggunakan
nameof
operator.sumber
Pertimbangkan bahwa Anda menggunakan variabel dalam kode Anda dan perlu mendapatkan nama variabel dan katakanlah cetak itu, Anda harus menggunakan
Dan jika kemudian seseorang refactor kode dan menggunakan nama lain untuk "myVar", dia harus memperhatikan nilai string dalam kode Anda dan menebusnya sesuai.
Alih-alih jika Anda punya
Ini akan membantu untuk refactor secara otomatis!
sumber
Type
, dan nilainya. Itu akan memungkinkan kode yang menerapkan metode logging untuk menghilangkan banyak redundansi.Artikel MSDN mencantumkan perutean MVC (contoh yang benar-benar mengklik konsep untuk saya) di antara beberapa lainnya. Paragraf deskripsi (diformat) berbunyi:
Jawaban yang diterima / berperingkat teratas sudah memberikan beberapa contoh nyata yang sangat baik.
sumber
Tujuan
nameof
operator adalah untuk memberikan nama sumber artefak.Biasanya nama sumber adalah nama yang sama dengan nama metadata:
Tapi ini mungkin tidak selalu terjadi:
Atau:
Satu kegunaan yang telah saya berikan untuk itu adalah untuk penamaan sumber daya:
Faktanya adalah, dalam hal ini, saya bahkan tidak memerlukan properti yang dihasilkan untuk mengakses sumber daya, tetapi sekarang saya memiliki waktu kompilasi memeriksa bahwa sumber daya ada.
sumber
Salah satu penggunaan
nameof
kata kunci adalah untuk pengaturanBinding
di WPF secara terprogram .untuk mengatur
Binding
Anda harus mengaturPath
dengan string, dan dengannameof
kata kunci, dimungkinkan untuk menggunakan opsi Refactor.Misalnya, jika Anda memiliki
IsEnable
properti ketergantungan di AndaUserControl
dan Anda ingin mengikatnya keIsEnable
beberapaCheckBox
di AndaUserControl
, Anda dapat menggunakan dua kode ini:dan
Jelas kode pertama tidak dapat memperbaiki tetapi yang aman ...
sumber
Sebelumnya kami menggunakan sesuatu seperti itu:
Alasan - kompilasi keamanan waktu. Tidak ada yang dapat secara diam-diam mengganti nama properti dan memecahkan logika kode. Sekarang kita bisa menggunakan nameof ().
sumber
Ini memiliki keuntungan ketika Anda menggunakan ASP.Net MVC. Saat Anda menggunakan HTML helper untuk membangun kontrol dalam tampilan, ia menggunakan nama properti dalam nama input html:
Itu membuat sesuatu seperti itu:
Jadi sekarang, jika Anda perlu memvalidasi properti Anda dalam metode Validasi Anda dapat melakukan ini:
Jika Anda mengubah nama properti Anda menggunakan alat refactoring, validasi Anda tidak akan rusak.
sumber
Contoh penggunaan lain
nameof
adalah memeriksa laman tab, alih-alih memeriksa indeks, Anda dapat memeriksaName
properti laman tab sebagai berikut:Kurang berantakan :)
sumber
Saya menemukan bahwa
nameof
meningkatkan keterbacaan pernyataan SQL yang sangat panjang dan kompleks dalam aplikasi saya. Itu membuat variabel menonjol dari lautan string dan menghilangkan pekerjaan Anda mencari tahu di mana variabel digunakan dalam pernyataan SQL Anda.sumber