Ngoài các câu trả lời hay khác, tôi sẽ thêm một lý do khác tại sao không đặt hằng số kiểu C vào C #. Bạn đã nói:
chúng tôi đánh dấu tham số là const để chắc chắn rằng trạng thái của nó sẽ không bị thay đổi trong phương thức.
Nếu const thực sự đã làm điều đó, điều đó sẽ rất tuyệt. Const không làm điều đó. Const là một lời nói dối!
Const không cung cấp bất kỳ đảm bảo rằng tôi thực sự có thể sử dụng. Giả sử bạn có một phương thức nhận một điều là const. Có hai mã tác giả: người viết gọi và người viết callee . Tác giả của callee đã làm cho phương thức có một const. Hai tác giả có thể cho rằng điều gì là bất biến về đối tượng?
Không có gì. Callee có thể tự do loại bỏ const và biến đổi đối tượng, vì vậy người gọi không có gì đảm bảo rằng việc gọi một phương thức nhận const thực sự sẽ không làm thay đổi nó. Tương tự như vậy, callee không thể giả định rằng nội dung của đối tượng sẽ không thay đổi trong suốt hành động của callee; callee có thể gọi một số phương thức thay đổi trên một bí danh không phải const của đối tượng const, và bây giờ cái gọi là đối tượng const đã thay đổi .
C-style const không cung cấp đảm bảo rằng đối tượng sẽ không thay đổi, và do đó bị phá vỡ. Bây giờ, C đã có một hệ thống kiểu yếu, trong đó bạn có thể diễn giải lại một hàm kép thành một int nếu bạn thực sự muốn, vì vậy không có gì ngạc nhiên khi nó cũng có một hệ thống kiểu yếu đối với const. Nhưng C # được thiết kế để có một hệ thống kiểu tốt , một hệ thống kiểu mà khi bạn nói "biến này chứa một chuỗi" thì biến đó thực sự chứa một tham chiếu đến một chuỗi (hoặc null). Chúng tôi hoàn toàn không muốn đặt một bổ ngữ "const" kiểu C vào hệ thống loại bởi vì chúng tôi không muốn hệ thống loại là một sự lừa dối . Chúng tôi muốn hệ thống loại phải mạnh để bạn có thể suy luận chính xác về mã của mình.
Const in C là một kim chỉ nam ; về cơ bản nó có nghĩa là "bạn có thể tin tưởng tôi để không cố gắng thay đổi điều này". Điều đó không nên có trong hệ thống loại ; nội dung trong hệ thống kiểu phải là sự thật về đối tượng mà bạn có thể suy luận, không phải là một hướng dẫn sử dụng nó.
Bây giờ, đừng hiểu lầm tôi; chỉ vì const trong C bị phá vỡ sâu sắc không có nghĩa là toàn bộ khái niệm là vô dụng. Những gì tôi muốn thấy là một số dạng chú thích "const" thực sự chính xác và hữu ích trong C #, một chú thích mà cả con người và trình biên dịch đều có thể sử dụng để giúp họ hiểu mã và rằng thời gian chạy có thể sử dụng để thực hiện những việc như phân tích cú pháp tự động và tối ưu hóa nâng cao khác.
Ví dụ, hãy tưởng tượng nếu bạn có thể "vẽ một cái hộp" xung quanh một đoạn mã và nói "Tôi đảm bảo rằng đoạn mã này không thực hiện đột biến đối với bất kỳ trường nào của lớp này" theo cách mà trình biên dịch có thể kiểm tra được. Hoặc vẽ một hộp có nội dung " phương pháp thuần túy này làm thay đổi trạng thái bên trong của đối tượng nhưng không theo bất kỳ cách nào có thể quan sát được bên ngoài hộp". Một đối tượng như vậy không thể tự động đa luồng một cách an toàn nhưng nó có thể được tự động ghi nhớ . Có tất cả các loại chú thích thú vị mà chúng tôi có thể đặt trên mã để cho phép tối ưu hóa phong phú và hiểu sâu hơn. Chúng ta có thể làm theo cách tốt hơn là chú thích const kiểu C yếu.
Tuy nhiên, tôi nhấn mạnh rằng đây chỉ là suy đoán . Chúng tôi không có kế hoạch chắc chắn để đưa loại tính năng này vào bất kỳ phiên bản giả định nào trong tương lai của C #, nếu thậm chí có một tính năng mà chúng tôi chưa công bố theo cách này hay cách khác. Đó là thứ mà tôi rất muốn thấy, và thứ mà sự nhấn mạnh sắp tới về điện toán đa lõi có thể yêu cầu, nhưng không có điều gì trong số này nên được hiểu là một dự đoán hoặc đảm bảo cho bất kỳ tính năng cụ thể hoặc hướng tương lai nào cho C #.
Bây giờ, nếu những gì bạn muốn chỉ là một chú thích trên biến cục bộ là một tham số cho biết "giá trị của tham số này không thay đổi trong suốt phương thức", thì chắc chắn, điều đó sẽ được thực hiện dễ dàng. Chúng tôi có thể hỗ trợ các địa phương và tham số "chỉ đọc" sẽ được khởi tạo một lần và lỗi thời gian biên dịch cần thay đổi trong phương thức. Biến được khai báo bởi câu lệnh "using" đã là một biến cục bộ; chúng tôi có thể thêm một chú thích tùy chọn cho tất cả các local và tham số để làm cho chúng hoạt động giống như các biến "sử dụng". Nó chưa bao giờ là một tính năng có mức độ ưu tiên rất cao nên nó chưa bao giờ được triển khai.