Ini muncul di benak saya setelah saya mempelajari yang berikut dari pertanyaan ini :
where T : struct
Kami, pengembang C #, semua tahu dasar-dasar C #. Maksud saya deklarasi, kondisional, loop, operator, dll.
Beberapa dari kita bahkan menguasai hal-hal seperti Generik , tipe anonim , lambdas , LINQ , ...
Tapi apa saja fitur atau trik paling tersembunyi dari C # yang bahkan tidak diketahui oleh penggemar, pecandu, dan pakar C #?
Berikut adalah fitur yang terungkap sejauh ini:
Kata kunci
yield
oleh Michael Stumvar
oleh Michael Stumusing()
pernyataan oleh kokosreadonly
oleh kokosas
oleh Mike Stoneas
/is
dari Ed Swangrenas
/is
(ditingkatkan) oleh Rocketpantsdefault
oleh deathofratsglobal::
oleh pzycomanusing()
blok oleh AlexCusevolatile
oleh Jakub Šturcextern alias
oleh Jakub Šturc
Atribut
DefaultValueAttribute
oleh Michael StumObsoleteAttribute
oleh DannySmurfDebuggerDisplayAttribute
oleh StuDebuggerBrowsable
danDebuggerStepThrough
oleh bdukesThreadStaticAttribute
oleh marxidadFlagsAttribute
oleh Martin ClarkeConditionalAttribute
oleh AndrewBurns
Sintaksis
??
(coalesce nulls) operator oleh kokos- Angka ditandai oleh Nick Berardi
where T:new
oleh Lars Mæhlum- Obat generik implisit oleh Keith
- Satu-parameter lambdas oleh Keith
- Properti otomatis oleh Keith
- Namespace alias oleh Keith
- Verbatim string literals dengan @ by Patrick
enum
nilai oleh lfoust- @variablenames oleh marxidad
event
operator oleh marxidad- Format kurung string dengan Portman
- Pengubah aksesibilitas properti atau akses oleh xanadont
- Operator kondisional (ternary) (
?:
) oleh JasonS checked
danunchecked
operator oleh Binoj Antonyimplicit and explicit
operator oleh Flory
Fitur Bahasa
- Jenis tidak dapat dihapus oleh Brad Barker
- Jenis anonim menurut Keith
__makeref __reftype __refvalue
oleh Judah Himango- Penginisialisasi objek oleh lomaxx
- Memformat string dengan David di Dakota
- Metode Penyuluhan oleh marxidad
partial
metode oleh Jon Erickson- Arahan preprosesor oleh preprosesor John Asbeck
DEBUG
direktif pra-prosesor oleh Robert Durgin- Operator kelebihan oleh SefBkn
- Ketik inferensi berdasarkan chakrit
- Operator Boolean dibawa ke tingkat berikutnya oleh Rob Gough
- Lulus variabel tipe nilai sebagai antarmuka tanpa tinju oleh Roman Boiko
- Secara terprogram menentukan jenis variabel yang dideklarasikan oleh Roman Boiko
- Konstruktor Statis oleh Chris
- Pemetaan ORM yang lebih mudah dilihat / dipadatkan menggunakan LINQ oleh roosteronacid
__arglist
oleh Zac Bowling
Fitur Visual Studio
- Pilih blok teks dalam editor oleh Himadri
- Cuplikan oleh DannySmurf
Kerangka
TransactionScope
oleh KiwiBastardDependantTransaction
oleh KiwiBastardNullable<T>
oleh IainMHMutex
oleh DiagoSystem.IO.Path
oleh ageektrappedWeakReference
oleh Juan Manuel
Metode dan Properti
String.IsNullOrEmpty()
metode oleh KiwiBastardList.ForEach()
metode oleh KiwiBastardBeginInvoke()
,EndInvoke()
metode oleh Will DeanNullable<T>.HasValue
danNullable<T>.Value
properti oleh RismoGetValueOrDefault
metode oleh John Sheehan
Tips dan Trik
- Metode yang bagus untuk penangan acara oleh Andreas HR Nilsson
- Perbandingan huruf besar oleh John
- Akses tipe anonim tanpa refleksi oleh dp
- Cara cepat untuk instantiate properti koleksi dengan malas oleh Will
- JavaScript-seperti fungsi inline anonim oleh roosteronacid
Lain
- netmodules oleh kokos
- LINQBridge oleh Duncan Smart
- Ekstensi Paralel oleh Joel Coehoorn
sumber
"a".Equals("A", StringComparison.OrdinalIgnoreCase)
Trik favorit saya adalah menggunakan operator penggabungan nol dan tanda kurung untuk secara otomatis instantiate koleksi untuk saya.
sumber
Hindari memeriksa penangan acara nol
Menambahkan delegasi kosong ke acara di deklarasi, menekan kebutuhan untuk selalu memeriksa acara untuk nol sebelum memanggilnya keren. Contoh:
Biarkan kamu melakukan ini
Alih-alih ini
Silakan juga lihat diskusi terkait ini dan posting blog ini oleh Eric Lippert tentang topik ini (dan kemungkinan kerugian).
sumber
Yang lainnya, plus
1) generik implisit (mengapa hanya pada metode dan bukan pada kelas?)
2) lambda sederhana dengan satu parameter:
3) jenis dan inisialisasi anonim:
Yang lainnya:
4) Properti otomatis dapat memiliki cakupan yang berbeda:
Terima kasih @pcomcoman untuk mengingatkan saya:
5) Alias Namespace (bukan berarti Anda membutuhkan perbedaan khusus ini):
sumber
new web.Control()
juga akan berfungsi dalam contoh ini. The::
kekuatan sintaks untuk mengobati awalan sebagai alias namespace, sehingga Anda bisa memiliki kelas yang disebutweb
danweb::Control
sintaks masih akan bekerja, sedangkanweb.Control
sintaks tidak akan tahu apakah untuk memeriksa kelas atau namespace. Karena itu saya cenderung selalu menggunakan::
alias namespace saat melakukan.Saya tidak tahu kata kunci "sebagai" selama beberapa waktu.
vs.
Yang kedua akan mengembalikan nol jika obj bukan MyClass, daripada melemparkan pengecualian pemain kelas.
sumber
Dua hal yang saya sukai adalah properti Otomatis sehingga Anda dapat menciutkan kode Anda lebih jauh:
menjadi
Juga inisialisasi objek:
menjadi
sumber
[DefaultValue]
digunakan untuk perancang sehingga ia tahu apakah akan menunjukkan properti dalam huruf tebal (artinya tidak default).Kata kunci 'default' dalam tipe umum:
menghasilkan 'null' jika T adalah tipe referensi, dan 0 jika itu adalah int, false jika itu adalah boolean, dan sebagainya.
sumber
Atribut secara umum, tetapi sebagian besar dari semua DebuggerDisplay . Menghemat Anda bertahun-tahun.
sumber
Hanya ingin memperjelas yang ini ... itu tidak memberitahu untuk mengabaikan karakter pelarian, itu sebenarnya memberitahu kompiler untuk menafsirkan string sebagai literal.
Jika Anda memiliki
itu benar-benar akan dicetak sebagai (perhatikan bahwa itu bahkan termasuk spasi putih yang digunakan untuk indentasi):
sumber
{{
untuk{
dan}}
untuk}
membuatnya berguna untukstring.Format()
.Saya pikir salah satu fitur yang paling kurang dihargai dan kurang dikenal dari C # (.NET 3.5) adalah Pohon Ekspresi , terutama ketika dikombinasikan dengan Generics dan Lambdas. Ini adalah pendekatan untuk pembuatan API yang menggunakan perpustakaan baru seperti NInject dan Moq.
Misalnya, katakanlah saya ingin mendaftarkan metode dengan API dan API perlu mendapatkan nama metode
Diberikan kelas ini:
Sebelumnya, sangat umum untuk melihat pengembang melakukan ini dengan string dan tipe (atau sesuatu yang sebagian besar berbasis string):
Yah, itu menyebalkan karena kurangnya mengetik yang kuat. Bagaimana jika saya mengganti nama "SomeMethod"? Sekarang, dalam 3,5 namun, saya bisa melakukan ini dengan cara yang sangat diketik:
Di mana kelas RegisterMethod menggunakan
Expression<Action<T>>
seperti ini:Ini adalah salah satu alasan utama mengapa saya jatuh cinta dengan Lambdas dan Pohon Ekspresi saat ini.
sumber
EditValue(someEmployee, e => e.FirstName);
dalam logika bisnis saya dan memilikinya secara otomatis menghasilkan semua logika pipa ledeng untuk ViewModel dan Lihat untuk mengedit properti itu (jadi, label dengan teks "Nama Depan" dan Kotak Teks dengan mengikat yang memanggil setter dari properti FirstName ketika pengguna mengedit nama, dan memperbarui tampilan menggunakan pengambil). Ini tampaknya menjadi dasar bagi sebagian besar DSL internal baru di C #." Hasil " akan muncul di pikiranku. Beberapa atribut seperti [DefaultValue ()] juga di antara favorit saya.
Kata kunci " var " sedikit lebih dikenal, tetapi Anda juga dapat menggunakannya dalam aplikasi .NET 2.0 (selama Anda menggunakan kompiler .NET 3.5 dan mengaturnya untuk mengeluarkan kode 2.0) tampaknya tidak terlalu dikenal. baik.
Sunting: kokos, terima kasih telah menunjukkan ?? Operator, itu memang sangat berguna. Karena agak sulit untuk google untuk itu (seperti ?? diabaikan), berikut adalah halaman dokumentasi MSDN untuk operator itu: ?? Operator (Referensi C #)
sumber
Saya cenderung menemukan bahwa sebagian besar pengembang C # tidak tahu tentang tipe 'nullable'. Pada dasarnya, primitif yang dapat memiliki nilai nol.
Setel angka nol , num1 , menjadi nol, lalu setel angka ganda, num2 , menjadi num1 atau -100 jika num1 bernilai nol.
http://msdn.microsoft.com/en-us/library/1t3y8s4s(VS.80).aspx
satu hal lagi tentang tipe Nullable:
itu mengembalikan String.Empty. Periksa tautan ini untuk detail lebih lanjut
sumber
as
operator) dengan obat generik saja. Nullable <T> sendiri adalah rudimenter dan jauh dari bintang, tetapi konsep tipe nullable sebagai bagian dari bahasa adalah kick ass.Berikut adalah beberapa fitur C # tersembunyi yang menarik, dalam bentuk kata kunci C # tidak berdokumen:
Ini adalah kata kunci C # tidak berdokumen (bahkan Visual Studio mengenalinya!) Yang ditambahkan untuk tinju / unboxing yang lebih efisien sebelum obat generik. Mereka bekerja dalam koordinasi dengan System.TypedReference struct.
Ada juga __arglist, yang digunakan untuk daftar parameter panjang variabel.
Satu hal yang tidak diketahui banyak orang adalah System.WeakReference - kelas yang sangat berguna yang melacak objek tetapi masih memungkinkan pengumpul sampah untuk mengumpulkannya.
Fitur "tersembunyi" yang paling berguna adalah kata kunci hasil pengembalian. Itu tidak benar-benar tersembunyi, tetapi banyak orang tidak tahu tentang itu. LINQ dibangun di atas ini; ini memungkinkan untuk permintaan yang dieksekusi dengan menghasilkan mesin negara di bawah kap. Raymond Chen baru-baru ini memposting tentang detail internal yang kasar .
sumber
Serikat pekerja (jenis memori yang dibagikan C ++) dalam C # murni dan aman
Tanpa beralih ke mode dan pointer yang tidak aman, Anda dapat meminta anggota kelas berbagi ruang memori di kelas / struct. Diberi kelas berikut:
Anda dapat mengubah nilai-nilai bidang byte dengan memanipulasi bidang Int32 dan sebaliknya. Misalnya, program ini:
Output ini:
cukup tambahkan menggunakan System.Runtime.InteropServices;
sumber
Menggunakan @ untuk nama variabel yang merupakan kata kunci.
sumber
Jika Anda ingin keluar dari program Anda tanpa memanggil blok atau penyelesai akhirnya gunakan FailFast :
sumber
Mengembalikan jenis anonim dari metode dan mengakses anggota tanpa refleksi.
sumber
Inilah yang bermanfaat untuk ekspresi reguler dan jalur file:
@ Memberitahu kompiler untuk mengabaikan karakter escape dalam sebuah string.
sumber
Mixin. Pada dasarnya, jika Anda ingin menambahkan fitur ke beberapa kelas, tetapi tidak dapat menggunakan satu kelas dasar untuk semua kelas tersebut, mintalah setiap kelas untuk mengimplementasikan antarmuka (tanpa anggota). Kemudian, tulis metode ekstensi untuk antarmuka , yaitu
Tentu saja, beberapa kejelasan dikorbankan. Tapi berhasil!
sumber
Benar, Salah, FileNotFound ?
sumber
Yang ini tidak "disembunyikan" sebanyak itu salah namanya.
Banyak perhatian diberikan pada algoritme "peta", "kurangi", dan "filter". Apa yang kebanyakan orang tidak sadari adalah. NET 3.5 menambahkan ketiga algoritma ini, tetapi memberi mereka nama yang sangat SQL-ish, berdasarkan pada fakta bahwa mereka adalah bagian dari LINQ.
Kemampuan untuk menggunakan LINQ untuk melakukan pekerjaan inline pada koleksi yang digunakan untuk mengambil iterasi dan persyaratan bisa sangat berharga. Perlu dipelajari bagaimana semua metode ekstensi LINQ dapat membantu membuat kode Anda jauh lebih ringkas dan mudah dikelola.
sumber
untuk baris baru independen sistem.
sumber
Jika Anda mencoba menggunakan kurung keriting di dalam ekspresi String.Format ...
sumber
[
dan]
adalah kurung kotak, dan<
dan>
adalah kurung sudut. Lihat en.wikipedia.org/wiki/Bracket .sumber
@ Id, saya agak enggan untuk memposting ini karena ini sedikit lebih dari sekadar nitpicking. Namun, saya akan menunjukkan bahwa dalam sampel kode Anda:
Jika Anda akan menggunakan 'apa adanya', mengapa harus diikuti dengan pemain aman menggunakan 'sebagai'? Jika Anda sudah memastikan bahwa obj memang MyClass, pemain standar rawa:
... tidak akan pernah gagal.
Demikian pula, Anda bisa mengatakan:
Saya tidak cukup tahu tentang. NET innards untuk memastikan, tetapi insting saya mengatakan kepada saya bahwa ini akan memotong maksimum dua jenis operasi pemain ke maksimum satu. Kemungkinan besar tidak akan merusak bank pemrosesan; secara pribadi, saya pikir bentuk terakhir terlihat lebih bersih juga.
sumber
is
danas
tidak akan melakukan gips pengguna. Jadi, kode di atas bertanya kepadais
operator apakah obj diturunkan dari MyClass (atau memiliki sistem terdefinisi yang ditetapkan pemain). Jugais
gagalnull
. Kedua kasus tepi ini mungkin penting untuk kode Anda. Misalnya, Anda mungkin ingin menulis:if( obj == null || obj is MyClass ) c = (MyClass)obj;
Tapi ini sangat berbeda dari:try { c = (MyClass)obj; } catch { }
karena yang pertama tidak akan melakukan konversi yang ditentukan pengguna, tetapi yang terakhir akan. Tanpanull
cek, mantan juga akan tidak diaturc
saatobj
ininull
.IEnumerable<int>
keList<int>
, dan castingobject
(new object()
) untukIEnumerable<int>
, untuk memastikan tidak ada kesalahan: pemain langsung: 5.43ns, is-> sebagai pemain: 6.75ns, sebagai pemain: 5.69ns. Kemudian menguji gips yang tidak valid: gips langsung: 3125000ns, sebagai gips: 5.41ns. Kesimpulan: berhenti mengkhawatirkan faktor 1%, dan pastikan Anda menggunakan adalah / seperti ketika para pemain mungkin tidak valid, menyebabkan pengecualian (juga jika ditangani) SANGAT lambat dibandingkan dengan casting, kita berbicara tentang faktor 578000 lebih lambat. Ingatlah bahwa bagian terakhir, sisanya tidak masalah (.Net FW 4.0, rilis build)Mungkin bukan teknik yang canggih, tapi yang saya lihat sepanjang waktu itu membuat saya gila:
dapat diringkas menjadi:
sumber