Diğer iyi cevaplara ek olarak, C-stili sabitliği C # 'a koymamak için başka bir neden daha ekleyeceğim. Dedin:
yöntemde durumunun değişmeyeceğinden emin olmak için parametreyi const olarak işaretleriz.
Const gerçekten bunu yapsaydı, bu harika olurdu. Const bunu yapmaz. Sabit bir yalan!
Const gerçekten kullanabileceğime dair hiçbir garanti vermiyor. Sabit bir şey alan bir yönteminiz olduğunu varsayalım. İki kod yazarı vardır: arayanı yazan kişi ve arayan ucu yazan kişi . Aranan ucun yazarı, yöntemin bir sabit almasını sağlamıştır. İki yazar neyin nesne hakkında değişmez olduğunu varsayabilir?
Hiçbir şey değil. Aranan uç, const'ı atmak ve nesneyi değiştirmek için serbesttir, bu nedenle arayan, bir const alan bir yöntemi çağırmanın onu değiştirmeyeceğinin garantisine sahip değildir. Benzer şekilde, aranan uç, nesnenin içeriklerinin aranan ucun eylemi boyunca değişmeyeceğini varsayamaz; aranan uç , const nesnesinin const olmayan bir diğer adı üzerinde bazı mutasyon yöntemlerini çağırabilirdi ve şimdi sözde const nesnesi değişti .
C-style const, nesnenin değişmeyeceğine ve dolayısıyla bozulacağına dair hiçbir garanti vermez. Şimdi, C zaten zayıf bir tür sisteme sahip, burada gerçekten istiyorsanız double türünün int'e yeniden yorumlanmasını sağlayabilirsiniz, bu nedenle const'a göre zayıf bir tür sisteme sahip olması şaşırtıcı olmamalıdır. Ancak C # iyi bir tür sistemine sahip olacak şekilde tasarlanmıştır , "bu değişken bir dize içerir" dediğinizde değişkenin aslında bir dizeye (veya boş) bir başvuru içerdiği bir tür sistemi . Yazım sistemine kesinlikle bir C-stili "const" değiştiricisi koymak istemiyoruz çünkü yazı sisteminin yalan olmasını istemiyoruz . Kodunuz hakkında doğru şekilde düşünebilmeniz için tür sisteminin güçlü olmasını istiyoruz .
Const in C bir kılavuzdur ; temelde "bu şeyi değiştirmeye çalışmama konusunda bana güvenebilirsin" anlamına gelir. Bu tür sisteminde olmamalıdır ; tip sistemindeki şeyler , kullanımıyla ilgili bir kılavuz değil, akıl yürütebileceğiniz nesne hakkında bir gerçek olmalıdır .
Şimdi, beni yanlış anlamayın; C'deki const'in derinden kırılmış olması, tüm kavramın işe yaramaz olduğu anlamına gelmez. Görmek istediğim şey , C # 'da "const" ek açıklamasının gerçekten doğru ve yararlı bir biçimidir; bu, hem insanların hem de derleyicilerin kodu anlamalarına yardımcı olmak için kullanabilecekleri ve çalışma zamanının otomatik paralelleştirme gibi şeyler yapmak için kullanabileceği bir ek açıklama ve diğer gelişmiş optimizasyonlar.
Örneğin, bir kod parçasının etrafına "bir kutu çizebildiğinizi" ve derleyici tarafından kontrol edilebilecek bir şekilde "Bu kod parçasının bu sınıfın hiçbir alanında mutasyon yapmayacağını garanti ediyorum" diyebildiğinizi hayal edin . Veya "bu saf yöntem nesnenin iç durumunu değiştirir, ancak kutunun dışında hiçbir şekilde gözlemlenemez " yazan bir kutu çizin . Böyle bir nesne otomatik olarak güvenli bir şekilde çoklu iş parçacıklı olamaz, ancak otomatik olarak hafızaya alınabilir . Zengin optimizasyonları ve daha derin anlayışı mümkün kılacak koda koyabileceğimiz her türlü ilginç ek açıklama vardır. Zayıf C-stili sabit açıklamasından çok daha iyisini yapabiliriz.
Ancak bunun sadece spekülasyon olduğunu vurguluyorum . Bu tür bir özelliği herhangi bir varsayımsal gelecek C # sürümüne koymak için kesin bir planımız yok, eğer varsa, öyle ya da böyle açıklamadık. Bu, görmeyi çok istediğim bir şey ve çok çekirdekli bilgi işlem üzerine gelecek vurgunun gerektirebileceği bir şey, ancak bunların hiçbiri, herhangi bir özelliğin veya C # için gelecek yönün bir tahmini veya garantisi olarak yorumlanmamalıdır.
Şimdi, eğer istediğiniz şey yerel değişken üzerinde "bu parametrenin değeri yöntem boyunca değişmez" diyen bir parametre olan bir açıklama ise, o zaman bu kolayca yapılabilir. Bir kez başlatılacak "salt okunur" yerelleri ve parametreleri ve yöntemde değişiklik yapmak için bir derleme zamanı hatasını destekleyebiliriz. "Using" ifadesiyle bildirilen değişken zaten yereldir; değişkenleri "kullanıyor" gibi davranmalarını sağlamak için tüm yerellere ve parametrelere isteğe bağlı bir açıklama ekleyebiliriz. Asla çok yüksek öncelikli bir özellik olmadı, bu yüzden hiç uygulanmadı.