На додаток до інших хороших відповідей, я додам ще одну причину, чому не можна вводити в C # стильність у C #. Ти сказав:
ми позначаємо параметр const, щоб бути впевненим, що його стан не буде змінено у методі.
Якби фактично це робив Конст, це було б чудово. Конст цього не робить. Конст - брехня!
Const не дає жодної гарантії, яку я фактично можу використовувати. Припустимо, у вас є метод, який вимагає рівноваги. Є два автори коду: людина, яка пише абонента, і особа, яка пише абонента . Автор виклику змусив метод прийняти const. Що можна вважати двома авторами щодо об'єкта?
Нічого. Оголошення вільне відкинути const та мутувати об’єкт, тому абонент не має гарантії, що виклик методу, який приймає const, насправді не буде його мутувати. Аналогічно, замовник не може припустити, що вміст об'єкта не змінюватиметься протягом всієї дії виклику; callee може викликати якийсь мутуючий метод на non-const псевдонімі const об'єкта, і тепер так званий об'єкт const змінився .
Const у стилі C не дає гарантії, що об'єкт не зміниться і тому буде зламаний. Тепер, у C вже є система слабкого типу, в якій ви можете зробити реінтерпретовану передачу подвійних в int, якщо цього дуже хочете, тому не повинно бути сюрпризом, що у неї є система слабкого типу і щодо const. Але C # був розроблений для того, щоб мати гарну систему типів, систему типів, де, коли ви говорите "ця змінна містить рядок", що змінна насправді містить посилання на рядок (або null). Ми абсолютно не хочемо вводити модифікатор типу "const" у тип типу в систему типів, оскільки не хочемо, щоб система типів була брехнею . Ми хочемо, щоб система типів була міцною, щоб ви могли правильно міркувати про свій код.
Const в C - це орієнтир ; це в основному означає "ви можете мені довіряти, щоб не намагатися мутувати цю річ". Це не повинно бути в системі типів ; речі в системі типів повинні бути фактом про об'єкт, про який ви можете міркувати, а не керівництвом щодо його використання.
Тепер не зрозумійте мене неправильно; тільки те, що const в C глибоко порушений, не означає, що вся концепція марна. Що я хотів би побачити - це фактично правильна і корисна форма анотації "const" в C #, примітка, яку можуть використовувати і люди, і компілятори, щоб допомогти їм зрозуміти код, і що час виконання може використовуватись для таких дій, як автоматична паралелізація та інші розширені оптимізації.
Наприклад, уявіть, якби ви могли «намалювати поле» навколо лука коду і сказати «Я гарантую, що ця команда коду не виконує жодних мутацій до будь-якого поля цього класу» таким чином, щоб це міг перевірити компілятор. Або намалюйте поле, в якому сказано, що "цей чистий метод мутує внутрішній стан об'єкта, але ніяк не спостерігається поза коробкою". Такий об'єкт не може бути безпечно багатопотоковим автоматично, але він може автоматично запам'ятовуватися . Існують всілякі цікаві примітки, які ми можемо застосувати до коду, які дозволять отримати багаті оптимізації та глибше розуміння. Ми можемо зробити набагато краще, ніж слабкі анотації в стилі С.
Однак наголошую, що це лише спекуляція . Ми не маємо твердих планів включити подібну особливість у будь-яку гіпотетичну майбутню версію C #, якщо вона є навіть такою, про яку ми не оголосили так чи інакше. Мені б хотілося це побачити, і те, на що може знадобитися подальший акцент на багатоядерних обчисленнях, але жодне з цього не повинно розглядатися як передбачення або гарантія будь-якої особливості чи майбутнього напрямку для C #.
Тепер, якщо ви хочете - це лише анотація до локальної змінної, яка є параметром, який говорить, що "значення цього параметра не змінюється протягом усього методу", то, звичайно, це було б легко зробити. Ми можемо підтримувати локальні локальні пристрої та параметри, які були б ініціалізовані один раз, і помилка часу компіляції, щоб змінити метод. Змінна, оголошена оператором "using", вже така локальна; ми можемо додати необов’язкове примітку до всіх локальних пристроїв та параметрів, щоб змусити їх діяти як "використання" змінних. Він ніколи не був дуже пріоритетним, тому він ніколи не був реалізований.