Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 20516|Jawab: 0

[Kiat] Empat puluh tujuh cara untuk mengoptimalkan program C#

[Salin tautan]
Diposting pada 15/03/2018 10.41.59 | | |

1. Ganti bidang yang dapat diakses dengan atribut

1、. Pengikatan data .NET hanya mendukung pengikatan data, dan Anda bisa mendapatkan manfaat pengikatan data dengan menggunakan atribut.
2. Dalam akses get and set ke properti, Anda dapat menggunakan lock untuk menambahkan dukungan multi-threading.

2. readonly (konstanta runtime) dan const (konstanta waktu kompilasi)

1. const hanya dapat digunakan untuk tipe primitif, enum, dan string, sedangkan readonly dapat berupa jenis apa pun;
2. const akan diganti dengan konstanta tertentu pada waktu kompilasi, sehingga jika nilai const dan readonly digunakan dalam referensi, perubahan ke readonly akan mengubah maksud asli desain, yaitu kebutuhan untuk mengkompilasi ulang rakitan yang diubah untuk mereferensikan ulang nilai konstanta baru.
3. ConST lebih efisien daripada readonly, tetapi kehilangan fleksibilitas aplikasi.

3. ADALAH dan SEBAGAI

1. Keduanya adalah konversi jenis pada runtime, karena operator hanya dapat digunakan dalam jenis referensi, sedangkan dapat menggunakan nilai dan jenis referensi;
2. Praktik yang biasa adalah menggunakan IS untuk menentukan jenis, dan kemudian memilih untuk menggunakan sebagai atau operator konversi tipe kuat (konversi yang ditentukan oleh operator) secara selektif.

4. ConditionalAttribute, bukan #if #endif条件编译

1. ConditionalAttribute hanya digunakan pada tingkat metode, dan item lain seperti jenis, atribut, dll. tidak valid. Dan #if #endif则不受此限制;
2. ConditionalAttribute dapat menambahkan beberapa operasi OR (OR) untuk kondisi kompilasi, dan #if #endif则可以添加与(AND) [di sini dapat sepenuhnya didefinisikan sebagai simbol terpisah lainnya];
3. Definisi ConditioanlAttribute dapat ditempatkan dalam metode terpisah untuk membuat program lebih fleksibel.

5. Berikan metode ToString()

1. Dapat memberikan informasi terperinci kepada pengguna dengan cara yang lebih ramah;
2. Gunakan metode IFormatter.ToString() untuk memberikan penyesuaian yang lebih fleksibel, dan jika Anda menambahkan antarmuka IFormatProvider dan ICustomFormatter, akan lebih masuk akal untuk menyesuaikan output pesan.

6. Perbedaan antara nilai dan jenis referensi

1. Jenis nilai tidak mendukung polimorfisme, yang cocok untuk menyimpan data yang dioperasikan oleh aplikasi, sedangkan referensi mendukung polimorfisme, yang cocok untuk menentukan perilaku aplikasi.
2. Untuk array yang didefinisikan sebagai jenis nilai, kinerja program dapat ditingkatkan secara signifikan;
3. Tipe nilai memiliki fragmentasi memori tumpukan yang lebih sedikit, sampah memori dan waktu akses tidak langsung, dan pengembalian dalam metode dilakukan dalam bentuk replikasi untuk menghindari pemaparan struktur internal ke dunia luar.
4. Jenis nilai digunakan dalam skenario berikut: Tanggung jawab jenis terutama digunakan untuk penyimpanan data; Antarmuka publik sepenuhnya ditentukan oleh beberapa atribut akses anggota data; Tidak pernah ada subkelas; Tidak pernah ada perilaku polimorfik.

7. Tipe nilai harus diterapkan sekonstan mungkin dan tipe atom

1. Membuat kode kami lebih mudah ditulis dan dipelihara;
2. Tiga strategi untuk menginisialisasi konstanta: dalam konstruksi; metode tanaman; Buat kelas pembantu yang dapat diubah (misalnya StringBuilder).

8. Pastikan bahwa 0 layak mendapatkan status yang valid

1. Status default dari jenis nilai harus 0;
2. 0 dari jenis enum tidak boleh tidak valid; Dalam FlagsAttribute adalah untuk memastikan bahwa nilai 0 adalah status valid;
3. Ketika string kosong, string dapat dikembalikan. string kosong untuk kosong.

9. Hubungan representasi ganda dari penilaian yang sama

1. ReferenceEquals() menentukan bahwa referensi adalah sama, dan itu harus benar ketika keduanya mengacu pada objek yang sama.
2. Metode Equals() statis digunakan untuk membuat penilaian referensi terlebih dahulu, dan kemudian untuk menilai jenis nilai;
3. Untuk penilaian jenis referensi, Anda dapat menggunakan metode tulis ulang Equals() saat menggunakan semantik nilai.
4. Saat menulis ulang metode Equals(), metode GetHashCode() juga harus ditulis ulang, dan operasi operater==() harus disediakan pada saat yang bersamaan.

10. Pahami kekurangan metode GetHashCode()

1. GetHashCode() hanya diterapkan pada nilai hash dari kunci yang ditentukan berbasis hash **, seperti HashTable atau Dictionary;
2. GetHashCode() harus mengikuti tiga aturan yang sesuai: dua objek yang sama harus mengembalikan kode hash yang sama; harus menjadi invarian instans; Fungsi hash harus menghasilkan distribusi acak di semua bilangan bulat.

11. Berikan prioritas pada penggunaan pernyataan perulangan foreach

1. foreach dapat menghilangkan pemeriksaan kompiler terhadap batas array perulangan for;
2. Variabel melingkar foreach bersifat baca-saja, dan ada transformasi eksplisit, yang melemparkan pengecualian ketika jenis objek ** salah;
3. ** yang diperlukan untuk menggunakan foreach adalah: memiliki metode GetEnumberator() publik; Antarmuka IEnumberable diimplementasikan secara eksplisit. Antarmuka IEnumerator diimplementasikan;
4. foreach dapat membawa manfaat manajemen sumber daya, karena jika compiler dapat menentukan antarmuka IDisposable, maka dapat menggunakan try... akhirnya memblokir;

12. Inisialisasi bidang default lebih baik daripada pernyataan penugasan

1. Masa pakai bidang akan menginisialisasi jenis nilai ke 0 dan jenis referensi ke null secara default.
2. Menginisialisasi objek yang sama beberapa kali akan mengurangi efisiensi eksekusi kode.
3. Menempatkan inisialisasi bidang di konstruktor kondusif untuk penanganan pengecualian.

13. Gunakan konstruktor statis untuk menginisialisasi anggota statis

1. Konstruktor statis akan dieksekusi sebelum metode, variabel, atau atribut kelas apa pun diakses;
2. Bidang statis juga akan berjalan sebelum konstruktor statis, dan konstruktor statis kondusif untuk penanganan pengecualian.

14. Gunakan rantai konstruktor (dalam. NET 4.0 sudah memecahkan masalah ini dengan parameter opsional)

1. Gunakan ini untuk menyerahkan pekerjaan inisialisasi ke konstruktor lain, dan gunakan basis untuk memanggil konstruktor kelas dasar;
2. Urutan operasi instans jenis adalah: atur semua bidang statis ke 0; Eksekusi inisialisasi medan statis; konstruktor statis yang mengeksekusi kelas dasar; Konstruktor statis yang mengeksekusi jenis saat ini;
Atur semua bidang instans ke 0; Jalankan penginisialisasi bidang instans; Eksekusi konstruktor instans kelas dasar yang sesuai; Jalankan konstruktor instans dari jenis saat ini.

15. Gunakan pernyataan using and try/finally untuk membersihkan sumber daya

Dalam metode Dispose() antarmuka IDisposable, GC.SuppressFinalize() dapat digunakan untuk memberi tahu pengumpul sampah bahwa operasi akhir tidak lagi dilakukan.

16. Minimalkan sampah memori

1. Dibutuhkan waktu prosesor ekstra untuk mengalokasikan dan menghancurkan objek di tumpukan;
2. Teknik untuk mengurangi jumlah objek yang ditetapkan: variabel lokal yang sering digunakan dipromosikan ke bidang; Menyediakan kelas yang menyimpan instance umum objek Singleton yang mengekspresikan jenis tertentu.
3. Gunakan StringBuilder untuk melakukan operasi string yang kompleks.

17. Minimalkan pengepakan dan pembongkaran

1. Perhatikan konversi implisit jenis ke System.Object, dan jenis nilai tidak boleh diganti dengan tipe System.Object;
2. Menggunakan antarmuka alih-alih jenis dapat menghindari tinju, yaitu menerapkan jenis nilai dari antarmuka, dan kemudian memanggil anggota melalui antarmuka.

18. Terapkan mode Buang standar

1. Untuk menggunakan sumber daya non-memori, ia harus memiliki finaler, pengumpul sampah akan menambahkan objek finaler yang diimplementasikan ke antrean terminasi setelah menyelesaikan objek memori yang belum menghentikannya, dan kemudian pengumpul sampah akan memulai utas baru untuk menjalankan finaler pada objek ini. Ini dapat menghindari masalah kebocoran memori yang disebabkan oleh sumber daya memori yang tidak dikelola tidak dirilis.
2. Menggunakan metode IDisposable.Dispose() memerlukan empat aspek pekerjaan: melepaskan semua sumber daya yang tidak dikelola; Bebaskan semua sumber daya yang dikelola; Atur penanda status untuk menunjukkan apakah Dispose() telah dieksekusi; Panggil GC.SuppressFinalize(this) untuk membatalkan operasi penghentian objek;
3. Tambahkan metode virtual yang dilindungi Dispose() ke jenis yang membutuhkan polimorfisme, dan kelas turunan melepaskan tugasnya dengan menulis ulang metode ini.
4. Dalam jenis yang membutuhkan antarmuka IDisoposable, kita harus mengimplementasikan terminator meskipun kita tidak membutuhkannya.

19. Tentukan dan terapkan antarmuka di atas jenis pewarisan

1. Jenis yang tidak terkait dapat bersama-sama mengimplementasikan antarmuka umum, dan lebih mudah untuk mengimplementasikan antarmuka daripada pewarisan;
2. Antarmuka relatif stabil, merangkum serangkaian fungsi dalam antarmuka sebagai jenis kontrak implementasi lainnya, sedangkan kelas dasar dapat diperluas dari waktu ke waktu.

20. Bedakan antara implementasi antarmuka dan penulisan ulang metode virtual

1. Saat mengimplementasikan antarmuka di kelas dasar, kelas turunan perlu menggunakan new untuk menyembunyikan penggunaan metode kelas dasar;
2. Metode antarmuka kelas dasar dapat dideklarasikan sebagai metode virtual, dan kemudian diimplementasikan di kelas turunan.

21. Gunakan kepercayaan untuk mengungkapkan panggilan balik

1. Delegasi itu sendiri tidak memberikan pengambilan pengecualian apa pun, sehingga setiap panggilan delegasi multicast akan mengakhiri seluruh rantai panggilan.
2. Dengan menampilkan dan memanggil setiap target delegasi pada rantai delegasi, Anda dapat menghindari delegasi multicast yang hanya mengembalikan output delegasi terakhir.

22. Gunakan peristiwa untuk menentukan antarmuka eksternal

1. Ini harus dideklarasikan sebagai peristiwa umum, dan membiarkan kompiler membuat metode add dan renmove untuk kita.
2. Gunakan kontainer System.ComponentModel.EventHandlerList untuk menyimpan setiap penanganan peristiwa, dan gunakan untuk menyembunyikan kompleksitas semua peristiwa ketika jenis tersebut berisi sejumlah besar peristiwa.

23. Hindari mengembalikan referensi ke objek kelas internal

1. Karena akses objek tipe nilai akan membuat salinan objek, atribut penentuan jenis nilai tidak akan mengubah status di dalam objek jenis sama sekali;
2. Tipe konstan dapat menghindari perubahan keadaan objek;
3. Tentukan antarmuka untuk membatasi akses ke subset untuk meminimalkan kerusakan pada keadaan internal objek.
4. Tentukan objek pembungkus untuk membatasi akses ke objek lain;
5. Ketika kode pelanggan mengubah elemen data internal, mode Pengamat dapat diterapkan, sehingga objek dapat memverifikasi atau sesuai dengan perubahan.

24. Pemrograman deklaratif lebih baik daripada pemrograman imperatif

Kemungkinan membuat kesalahan dalam beberapa algoritme tulisan tangan serupa dapat dihindari dan kode yang jelas dan dapat dibaca disediakan.

25. Terapkan jenis seseri mungkin

1. Jenis ini bukan mewakili kontrol, jendela, atau formulir UI, dan jenisnya harus mendukung serialisasi;
2. Saat menambahkan atribut deserialized NonSerializedAttribute, nilai default dapat dimuat oleh metode OnDeserialization() yang mengimplementasikan IDeserializationCallback;
3. Dalam kontrol versi, Anda dapat menggunakan antarmuka ISerializable untuk kontrol fleksibel, dan menyediakan konstruktor serialisasi untuk menginisialisasi objek sesuai dengan data dalam aliran, dan juga memerlukan izin pengecualian SerializationFormatter saat mengimplementasikan.
4. Jika Anda perlu membuat kelas turunan, Anda perlu menyediakan metode hook untuk kelas turunan.

26. Gunakan antarmuka IComparable dan IComparer untuk mengimplementasikan hubungan penyortiran

1. Antarmuka IComparable digunakan untuk mengimplementasikan hubungan penyortiran yang paling alami untuk jenis, membebani empat operator perbandingan, dan menyediakan versi metode CompareTo() yang kelebihan beban untuk menerima jenis tertentu sebagai parameter.
2. IComparer digunakan untuk menyediakan hubungan penyortiran yang berbeda dari IComparable, atau untuk memberi kita hubungan penyortiran yang menurut jenis itu sendiri tidak diimplementasikan.

27. Hindari antarmuka ICloneable

1. Untuk jenis nilai, tidak perlu mendukung antarmuka ICloneable, cukup gunakan operasi penugasan default;
2. Untuk kelas dasar yang mungkin perlu mendukung antarmuka ICloneable, konstruktor replikasi yang dilindungi harus dibuat untuk mereka, dan antarmuka IConeable harus dihindari.

28. Hindari operator konversi paksa

Menggunakan konstruktor alih-alih operator konversi dapat membuat konversi bekerja lebih jelas, yang dapat dengan mudah menyebabkan beberapa bug aneh karena objek sementara yang digunakan setelah konversi.

29. Hanya pertimbangkan untuk menggunakan pengubah baru ketika akumulasi versi baru menyebabkan masalah

30. Terapkan rakitan yang kompatibel dengan CLS sebanyak mungkin
1. Untuk membuat rakitan yang kompatibel, dua aturan perlu diikuti: parameter dan jenis nilai pengembalian yang digunakan oleh semua anggota umum dan dilindungi dari rakitan harus kompatibel dengan CLS; Setiap anggota publik dan dilindungi yang tidak kompatibel dengan CLS harus memiliki alternatif yang kompatibel dengan CLS;
2. Anda dapat melewati pemeriksaan jenis kompatibilitas CLS dengan mengimplementasikan antarmuka secara eksplisit, dan CLSCompliantAttribute tidak akan memeriksa kompatibilitas CLS anggota privat.

31. Terapkan metode yang singkat dan ringkas sebanyak mungkin

1. Kompiler JIT mengkompilasi dalam satuan metode, dan metode yang tidak dipanggil tidak akan dikompilasi oleh JIT;
2. Jika kode pernyataan Case di Switch yang lebih panjang diganti dengan satu metode pada satu waktu, waktu yang disimpan oleh kompiler JIT akan dikalikan;
3. Metode yang singkat dan ringkas dan memilih lebih sedikit variabel lokal dapat memperoleh penggunaan register yang optimal;
4. Semakin sedikit cabang kontrol dalam metode, semakin mudah bagi kompiler JIT untuk memasukkan variabel ke dalam register.

32. Wujudkan rakitan ukuran kecil dan kohesif tinggi sebanyak mungkin

1. Masukkan semua kelas publik dan kelas dasar umum ke dalam beberapa rakitan, masukkan kelas alat yang menyediakan fungsi untuk kelas publik ke dalam rakitan yang sama, kemas antarmuka publik yang relevan ke dalam rakitan mereka sendiri, dan akhirnya memproses kelas yang berada di seluruh posisi horizontal dalam aplikasi;
2. Pada prinsipnya, dua jenis komponen harus dibuat: satu adalah rakitan kecil dan agregat dengan fungsi tertentu, dan yang lainnya adalah rakitan besar dan lebar dengan fungsi umum.

33. Batasi visibilitas jenis

1. Menggunakan antarmuka untuk mengekspos fungsi jenis dapat memudahkan kita untuk membuat kelas internal tanpa membatasi ketersediaannya di luar perakitan;
2. Semakin sedikit jenis publik yang terpapar ke dunia luar, semakin banyak pilihan yang Anda miliki untuk ekspansi dan implementasi perubahan di masa mendatang.

34. Buat API Web terperinci besar

Ini meminimalkan frekuensi dan beban transaksi antar mesin, menempatkan operasi besar dan eksekusi terperinci ke server.

35. Menulis ulang lebih baik daripada pemroses peristiwa

1. Jika prosesor peristiwa melemparkan pengecualian, prosesor lain pada rantai peristiwa tidak akan dipanggil, tetapi ini tidak akan terjadi pada metode virtual yang ditulis ulang.
2. Menulis ulang jauh lebih efisien daripada pemroses peristiwa asosiatif, yang perlu mengulangi seluruh daftar permintaan, yang memakan lebih banyak waktu CPU.
3. Peristiwa dapat ditanggapi saat runtime, dengan lebih banyak fleksibilitas, dan beberapa respons dapat dikaitkan dengan peristiwa yang sama.
4. Aturan umum adalah menangani peristiwa turunan, dan metode penulisan ulang lebih baik.

36. Penggunaan wajar. Diagnostik runtime .NET

1. System.Diagnostics.Debug\Trace\EventLog menyediakan semua alat yang diperlukan agar program menambahkan informasi diagnostik ke runtime, dan aplikasi dapat menulis ke log peristiwa sistem ketika EventLog menyediakan bahan;
2. Terakhir, jangan menulis perpustakaan diagnostik Anda sendiri, .NET FCL sudah memiliki perpustakaan inti yang kita butuhkan.

37. Gunakan mekanisme konfigurasi standar

1、. Kelas System.Windows.Application dari kerangka kerja .NET mendefinisikan properti bagi kami untuk membuat jalur konfigurasi umum;
2. Application.LocalAppDataPath dan Application.userDataPath akan menghasilkan nama jalur direktori data lokal dan data pengguna;
3. Jangan menulis data di direktori sistem ProgramFiles dan Windows, lokasi ini memerlukan izin keamanan yang lebih tinggi, jangan berharap pengguna memiliki izin tulis.

38. Sesuaikan dan dukung pengikatan data

1. Dua objek BindingMananger dan CurrencyManager mewujudkan transfer data antara kontrol dan sumber data;
2. Keuntungan dari pengikatan data: menggunakan pengikatan data jauh lebih sederhana daripada menulis kode Anda sendiri; Ini harus digunakan untuk cakupan selain item data teks - properti tampilan lainnya juga dapat diikat; Untuk pengikatan data Windowos Forms, kemampuan untuk menangani beberapa sinkronisasi kontrol sumber data terkait pemeriksaan;
3. Ketika objek tidak mendukung atribut yang diperlukan, Anda dapat mendukung pengikatan data dengan memblokir objek saat ini dan kemudian menambahkan objek yang diinginkan.

39. Menggunakan. Validasi .NET

1. Ada lima kontrol dalam ASP.NET untuk memverifikasi validitas, dan Anda dapat menggunakan CustomValidator untuk menurunkan kelas baru untuk menambahkan pengautentikasi Anda sendiri.
2. Validasi Windows memerlukan sub-System.Windows.Forms.Control.Validating untuk menulis penangan peristiwa.

40. Pilih yang sesuai ** sesuai dengan kebutuhan

1. Array memiliki dua cacat yang jelas: tidak dapat diubah ukurannya secara dinamis; Mengubah ukuran memakan waktu;
2. ArrayList mencampur karakteristik array satu dimensi dan daftar tertaut, Queue dan Stack adalah array khusus berdasarkan Array;
3. Ketika program lebih fleksibel untuk menambah dan menghapus item, itu dapat membuat jenis yang lebih kuat, dan saat membuat kelas yang mensimulasikan **, ia harus mengimplementasikan pengindeks dan antarmuka yang dapat dinomor IE untuk itu.

41. DataSet lebih baik daripada struktur khusus

1. DataSets memiliki dua kelemahan: interaksi antara DataSet menggunakan mekanisme serialisasi XML dan kode non-.NET tidak terlalu baik; DataSet adalah wadah yang sangat serbaguna;
2. Jenis DataSet yang kuat melanggar lebih banyak aturan desain, dan efisiensi pengembangannya jauh lebih tinggi daripada desain yang lebih elegan yang ditulis sendiri.

42. Gunakan karakteristik untuk menyederhanakan refleksi

Dengan merancang dan menerapkan kelas fitur yang memaksa pengembang untuk mendeklarasikan jenis, metode, dan atribut yang dapat digunakan secara dinamis, Anda dapat mengurangi kesalahan runtime aplikasi dan meningkatkan kepuasan pengguna perangkat lunak.

43. Hindari menggunakan refleks secara berlebihan

1. Parameter dan nilai pengembalian yang digunakan oleh anggota Invoke adalah System.Object, yang mengonversi jenis saat runtime, tetapi kemungkinan masalah menjadi lebih mungkin.
2. Antarmuka memungkinkan kita untuk mendapatkan sistem yang lebih jelas dan lebih mudah dipelihara, dan refleksi adalah mekanisme pengikatan terlambat yang sangat kuat. .NET framework menggunakannya untuk mengimplementasikan pengikatan data untuk kontrol Windows dan kontrol web.

44. Buat kelas pengecualian khusus untuk aplikasi

1. Satu-satunya alasan mengapa kelas pengecualian yang berbeda diperlukan adalah untuk memungkinkan pengguna dengan mudah mengambil pendekatan yang berbeda untuk kesalahan yang berbeda saat menulis prosesor tangkapan;
2. Ketika mungkin ada perilaku perbaikan yang berbeda, kita harus membuat berbagai kelas pengecualian yang berbeda, dengan menyediakan semua konstruktor yang didukung oleh kelas dasar pengecualian, kita dapat membuat kelas pengecualian yang berfungsi penuh untuk aplikasi, dan menggunakan atribut InnerException untuk menyimpan semua informasi kesalahan yang dihasilkan oleh kondisi kesalahan tingkat rendah.

45. Prioritaskan jaminan keamanan abnormal

1. Jaminan pengecualian yang kuat memberikan keseimbangan terbaik antara pemulihan dari pengecualian dan penanganan pengecualian yang disederhanakan, dan status program tetap tidak berubah ketika operasi terganggu karena pengecualian.
2. Melakukan penyalinan defensif dari data yang akan dimodifikasi, memodifikasi salinan defensif dari data ini, operasi di tengah dapat menyebabkan pengecualian, dan salinan sementara dan objek asli akan ditukar;
3. Terminator, metode Dispose(), dan metode target yang terikat pada delegasi harus memastikan bahwa mereka tidak melemparkan pengecualian dalam keadaan apa pun.

46. Minimalkan interoperabilitas

1. Ada tiga biaya interoperabilitas: biaya pencacahan data antara tumpukan terkelola dan tidak terkelola, biaya peralihan antara kode terkelola dan kode tidak terkelola, dan pekerjaan pengembangan pengembang yang berurusan dengan lingkungan hibrida;
2. Menggunakan tipe blitable dalam interop dapat secara efektif mereplikasi bolak-balik antara lingkungan yang dikelola dan tidak dikelola tanpa terpengaruh oleh struktur internal objek.
3. Gunakan fitur In/Out untuk memastikan beberapa replikasi yang tidak perlu yang paling tepat, dan tingkatkan performa dengan mendeklarasikan bagaimana data dihitung.
4. Gunakan COM Interop untuk mengimplementasikan interoperabilitas dengan komponen COM dengan cara yang paling sederhana, gunakan P/Invoke untuk memanggil API Win32, atau gunakan sakelar /CLR dari kompiler C++ untuk mencampur kode terkelola dan tidak terkelola;

47. Prioritaskan kode keselamatan

1. Hindari mengakses memori yang tidak terkelola sebanyak mungkin, dan penyimpanan terisolasi tidak dapat mencegah akses dari kode terkelola dan pengguna tepercaya.
2. Saat rakitan berjalan di web, pertimbangkan untuk menggunakan penyimpanan terisolasi, dan ketika algoritme tertentu memerlukan izin keamanan yang lebih tinggi, kode tersebut harus diisolasi dalam rakitan terpisah.

48. Kuasai alat dan sumber daya yang relevan

1. Gunakan NUnit untuk menetapkan pengujian unit otomatis (terintegrasi dalam VS2010);
2. Alat FXCop akan mendapatkan kode IL dalam perakitan, menganalisisnya terhadap aturan pengkodean heterogen dan praktik terbaik, dan akhirnya melaporkan pelanggaran.
3. ILDasm adalah alat pembongkaran IL yang dapat membantu kami mendapatkan wawasan tentang detail;
4. Shared Source CLI adalah kode sumber implementasi yang berisi kernel kerangka kerja .NET dan kompiler C#.




Mantan:Service Fabric - Konsep Layanan Stateful
Depan:.net/c# SynchronizationContext untuk detailnya
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com