Sebagai tambahan dari jawaban bagus lainnya, saya akan menambahkan alasan lain mengapa untuk tidak menempatkan kekonstanan gaya-C ke dalam C #. Kamu berkata:
kami menandai parameter sebagai const untuk memastikan bahwa statusnya tidak akan diubah dalam metode.
Jika const benar-benar melakukan itu, itu akan bagus. Const tidak melakukan itu. Const adalah bohong!
Const tidak memberikan jaminan apa pun yang benar-benar dapat saya gunakan. Misalkan Anda memiliki metode yang mengambil benda const. Ada dua penulis kode: orang yang menulis penelepon dan orang yang menulis panggilan . Penulis callee telah membuat metode take a const. Apa yang dapat diasumsikan oleh kedua penulis itu tidak tetap tentang objek?
Tidak ada. Callee bebas untuk membuang const dan memutasi objek, jadi pemanggil tidak memiliki jaminan bahwa memanggil metode yang menggunakan const sebenarnya tidak akan memutasinya. Demikian pula, callee tidak dapat berasumsi bahwa konten objek tidak akan berubah selama tindakan callee; callee bisa memanggil beberapa metode mutasi pada alias non const dari objek const, dan sekarang yang disebut objek const telah berubah .
C-style const tidak memberikan jaminan bahwa objek tidak akan berubah, dan karenanya rusak. Sekarang, C sudah memiliki sistem tipe lemah di mana Anda dapat melakukan interpretasi ulang pemeran ganda menjadi int jika Anda benar-benar menginginkannya, jadi tidak mengherankan bahwa ia memiliki sistem tipe yang lemah sehubungan dengan const juga. Tapi C # dirancang untuk memiliki sistem tipe yang baik , sistem tipe di mana ketika Anda mengatakan "variabel ini berisi string" bahwa variabel sebenarnya berisi referensi ke string (atau null). Kami benar-benar tidak ingin menempatkan pengubah "const" gaya-C ke dalam sistem tipe karena kami tidak ingin sistem tipe menjadi kebohongan . Kami ingin sistem tipe kuat sehingga Anda dapat bernalar dengan benar tentang kode Anda.
Const dalam C adalah pedoman ; itu pada dasarnya berarti "Anda dapat mempercayai saya untuk tidak mencoba mengubah hal ini". Itu seharusnya tidak dalam sistem tipe ; hal-hal dalam sistem tipe haruslah fakta tentang objek yang bisa Anda pertimbangkan, bukan pedoman penggunaannya.
Sekarang, jangan salah paham; hanya karena const di C sangat rusak tidak berarti bahwa seluruh konsep tidak berguna. Yang ingin saya lihat adalah beberapa bentuk anotasi "const" yang benar- benar benar dan berguna di C #, anotasi yang dapat digunakan oleh manusia dan penyusun untuk membantu mereka memahami kode, dan yang dapat digunakan runtime untuk melakukan hal-hal seperti kelumpuhan otomatis dan pengoptimalan lanjutan lainnya.
Misalnya, bayangkan jika Anda bisa "menggambar kotak" di sekitar sebongkah kode dan berkata "Saya jamin kumpulan kode ini tidak melakukan mutasi ke bidang mana pun dari kelas ini" dengan cara yang dapat diperiksa oleh penyusun. Atau gambar kotak yang mengatakan " metode murni ini mengubah keadaan internal objek tetapi tidak dengan cara apa pun yang dapat diamati di luar kotak". Objek seperti itu tidak dapat dengan aman di-multi-threaded secara otomatis tetapi dapat secara otomatis dibuat memo . Ada berbagai macam anotasi menarik yang dapat kami masukkan ke dalam kode yang memungkinkan pengoptimalan yang kaya dan pemahaman yang lebih dalam. Kita bisa melakukan cara yang lebih baik daripada anotasi const gaya-C yang lemah.
Namun, saya tegaskan bahwa ini hanyalah spekulasi . Kami tidak memiliki rencana pasti untuk menempatkan fitur semacam ini ke dalam versi hipotetis C # di masa depan, jika ada, yang belum kami umumkan dengan satu atau lain cara. Ini adalah sesuatu yang saya ingin lihat, dan sesuatu yang mungkin diperlukan oleh penekanan pada komputasi multi-core, tetapi tidak satupun dari ini harus ditafsirkan sebagai prediksi atau jaminan fitur tertentu atau arah masa depan untuk C #.
Sekarang, jika yang Anda inginkan hanyalah anotasi pada variabel lokal yang merupakan parameter yang mengatakan "nilai parameter ini tidak berubah sepanjang metode", maka, tentu, itu akan mudah dilakukan. Kami dapat mendukung lokal "readonly" dan parameter yang akan diinisialisasi satu kali, dan kesalahan waktu kompilasi untuk mengubah metode. Variabel yang dideklarasikan oleh pernyataan "using" sudah seperti itu; kita bisa menambahkan anotasi opsional ke semua lokal dan parameter untuk membuatnya bertindak seperti variabel "menggunakan". Ini tidak pernah menjadi fitur dengan prioritas yang sangat tinggi sehingga tidak pernah diterapkan.