Dalam rilis terbaru podcast DotNet & More Blazor, NetCore 3.0 Preview, C # 8 dan tidak hanya kami hanya dengan santai menyebutkan topik yang membakar seperti C # 8. Kisah tentang pengalaman dengan C # 8 tidak cukup besar untuk mencurahkan masalah terpisah untuk itu, jadi diputuskan untuk berbagi cara genre epistolary dengannya.
Pada artikel ini, saya ingin berbicara tentang pengalaman saya menggunakan C # 8 pada produksi selama 4 bulan. Di bawah ini Anda dapat menemukan jawaban untuk pertanyaan-pertanyaan berikut:
- Cara "mengeja" di C # baru
- Fitur apa yang benar-benar bermanfaat
- Sangat kecewa
Daftar lengkap fitur C # 8 dapat ditemukan di dokumentasi resmi dari Microsoft . Dalam artikel ini, saya akan menghilangkan peluang yang tidak bisa saya coba karena satu dan lain alasan, yaitu:
- Anggota yang hanya baca
- Anggota antarmuka default
- Struct ref sekali pakai
- Aliran asinkron
- Indeks dan rentang
Saya mengusulkan untuk memulai dengan salah satu kemungkinan yang paling lezat, seperti yang tampak bagi saya sebelumnya.
Alihkan ekspresi
Dalam mimpi kami, kami menyajikan fungsi ini dengan sangat cerah:
int Exec(Operation operation, int x, int y) => operation switch { Operation.Summ => x + y, Operation.Diff => x - y, Operation.Mult => x * y, Operation.Div => x / y, _ => throw new NotSupportedException() };
Namun, sayangnya, kenyataan membuat penyesuaiannya sendiri.
Pertama, tidak ada kemungkinan menggabungkan kondisi:
string TrafficLights(Signal signal) { switch (signal) { case Signal.Red: case Signal.Yellow: return "stop"; case Signal.Green: return "go"; default: throw new NotSupportedException(); } }
Dalam praktiknya, ini berarti bahwa dalam setengah kasus, ekspresi sakelar harus diubah menjadi sakelar biasa untuk menghindari copy-paste.
Kedua, sintaks baru tidak mendukung pernyataan, mis. kode yang tidak mengembalikan nilai. Tampaknya, well, dan itu tidak perlu, tetapi saya sendiri terkejut ketika saya menyadari betapa seringnya saklar digunakan (dalam hubungannya dengan pencocokan pola) untuk hal seperti pernyataan dalam tes.
Ketiga, beralih ekspresi, yang mengikuti dari paragraf terakhir, tidak mendukung penangan multi-line. Betapa menakutkannya kami memahami pada saat menambahkan log:
int ExecFull(Operation operation, int x, int y) { switch (operation) { case Operation.Summ: logger.LogTrace("{x} + {y}", x, y); return x + y; case Operation.Diff: logger.LogTrace("{x} - {y}", x, y); return x - y; case Operation.Mult: logger.LogTrace("{x} * {y}", x, y); return x * y; case Operation.Div: logger.LogTrace("{x} / {y}", x, y); return x / y; default: throw new NotSupportedException(); } }
Saya tidak ingin mengatakan bahwa saklar baru itu buruk. Tidak, dia baik, hanya saja tidak cukup baik.
Pola Properti & Posisi
Setahun yang lalu, bagi saya mereka tampak sebagai kandidat utama untuk gelar "peluang yang mengubah pembangunan." Dan, seperti yang diharapkan, untuk menggunakan kekuatan penuh dari pola posisi dan properti, Anda perlu mengubah pendekatan Anda terhadap pengembangan. Yaitu, perlu untuk meniru tipe data aljabar.
Tampaknya, apa masalahnya: ambil antarmuka penanda dan pergi. Sayangnya, metode ini memiliki kelemahan serius dalam proyek besar: tidak ada yang menjamin pelacakan dalam waktu desain perluasan tipe aljabar Anda. Jadi, sangat mungkin bahwa seiring waktu, perubahan kode akan menyebabkan banyak "kegagalan secara default" di tempat-tempat yang paling tidak terduga.
Pola Tuple
Tetapi "adik laki-laki" dari kemungkinan perbandingan yang baru dengan sampel terbukti benar-benar dilakukan dengan baik. Masalahnya adalah bahwa pola tuple tidak memerlukan perubahan apa pun dalam arsitektur kode kita yang sudah dikenal, itu hanya menyederhanakan beberapa kasus:
Player? Play(Gesture left, Gesture right) { switch (left, right) { case (Gesture.Rock, Gesture.Rock): case (Gesture.Paper, Gesture.Paper): case (Gesture.Scissors, Gesture.Scissors): return null; case (Gesture.Rock, Gesture.Scissors): case (Gesture.Scissors, Gesture.Paper): case (Gesture.Paper, Gesture.Rock): return Player.Left; case (Gesture.Paper, Gesture.Scissors): case (Gesture.Rock, Gesture.Paper): case (Gesture.Scissors, Gesture.Rock): return Player.Right; default: throw new NotSupportedException(); } }
Tetapi bagian terbaiknya adalah bahwa fitur ini, yang cukup dapat diprediksi, berfungsi baik dengan metode Dekonstruksi. Cukup lewati kelas dengan Deconstruct yang diimplementasikan untuk beralih dan menggunakan kemampuan pola tuple.
Menggunakan deklarasi
Tampaknya ini peluang kecil, tetapi membawa banyak kegembiraan. Dalam semua promo, Microsoft berbicara tentang aspek seperti mengurangi bersarang. Tapi mari kita jujur, tidak terlalu penting. Tetapi yang benar-benar serius adalah efek samping dari mengecualikan satu blok kode:
- Seringkali, ketika menambahkan menggunakan, kita harus menarik kode "di dalam" blok menggunakan metode salin-tempel. Sekarang kita tidak memikirkannya
- Variabel yang dideklarasikan di dalam menggunakan dan digunakan setelah Buang objek menggunakan adalah sakit kepala nyata. Satu masalah lebih sedikit
- Di kelas yang membutuhkan Panggilan sering, masing-masing metode akan 2 baris lebih lama. Ini akan tampak sepele, tetapi dalam kondisi banyak metode kecil, sepele ini tidak memungkinkan untuk menampilkan cukup banyak metode ini pada satu layar
Akibatnya, hal sederhana seperti menggunakan deklarasi mengubah perasaan pengkodean sehingga Anda tidak ingin kembali ke c # 7.3.
Fungsi lokal statis
Sejujurnya, jika bukan karena bantuan analisis kode, saya bahkan tidak akan melihat kemungkinan ini. Namun demikian, itu benar-benar menetap dalam kode saya: setelah semua, fungsi lokal statis sangat cocok dengan peran fungsi murni kecil, karena mereka tidak dapat mendukung penutupan variabel metode. Alhasil, itu lebih mudah di hati, karena Anda mengerti bahwa ada satu kesalahan kurang potensial dalam kode Anda.
Jenis referensi tidak dapat dibatalkan
Dan untuk hidangan penutup, saya ingin menyebutkan fitur paling penting dari C # 8. Sebenarnya, mem-parsing tipe referensi yang tidak dapat dibatalkan layak mendapatkan artikel terpisah. Saya hanya ingin menggambarkan sensasi.
Ringkasan
Tentu saja, peluang yang disajikan tidak mencapai revolusi penuh, tetapi ada semakin sedikit kesenjangan antara C # dan F # / Scala. Apakah itu baik atau buruk, waktu akan memberi tahu.
Pada saat rilis artikel ini, C # 8 mungkin sudah menetap di proyek Anda, jadi saya akan bertanya-tanya, apa perasaan Anda tentang versi baru bahasa favorit kami?