loại bất di bất dịch là một điều tốt thường: (! Bạn không cần phải khóa cái gì đó không thể thay đổi)
- Họ làm việc tốt hơn cho đồng thời
- Họ giảm lỗi: đối tượng có thể thay đổi dễ bị tổn thương để được thay đổi khi bạn không mong đợi nó có thể giới thiệu tất cả các loại lỗi lạ ("hành động ở khoảng cách")
- Chúng có thể được chia sẻ an toàn (nghĩa là nhiều tham chiếu đến cùng một đối tượng) có thể giảm tiêu thụ bộ nhớ và cải thiện sử dụng bộ nhớ cache.
- Chia sẻ cũng giúp sao chép một hoạt động O (1) rất rẻ khi nó sẽ là O (n) nếu bạn phải lấy một bản sao phòng thủ của một đối tượng có thể thay đổi. Đây là một vấn đề lớn bởi vì sao chép là một hoạt động cực kỳ phổ biến (ví dụ: bất cứ khi nào bạn muốn chuyển các thông số xung quanh ....)
Kết quả là thiết kế ngôn ngữ khá không hợp lý.
Một số ngôn ngữ (đặc biệt là các ngôn ngữ chức năng như Haskell và Clojure) đi xa hơn và làm cho mọi thứ trở nên bất biến. Điều này enlightening video là rất đáng xem nếu bạn quan tâm đến những lợi ích của bất biến.
Có một vài nhược điểm nhỏ với nhiều loại bất biến:
- Operations tạo ra một chuỗi thay đổi như nối đắt hơn bởi vì bạn cần phải xây dựng các đối tượng mới. Thông thường chi phí là O (n + m) để ghép hai chuỗi bất biến, mặc dù nó có thể đi thấp như O (log (m + n)) nếu bạn sử dụng một cấu trúc dữ liệu chuỗi dựa trên cây như một Rope. Ngoài ra, bạn luôn có thể sử dụng các công cụ đặc biệt như Java của StringBuilder nếu bạn thực sự cần phải nối Chuỗi hiệu quả.
- Một thay đổi nhỏ trên một chuỗi lớn có thể dẫn đến sự cần thiết phải xây dựng một bản sao hoàn toàn mới của chuỗi lớn, rõ ràng là làm tăng mức tiêu thụ bộ nhớ. Tuy nhiên, lưu ý rằng đây không phải là vấn đề lớn trong các ngôn ngữ được thu gom rác vì bản sao cũ sẽ bị thu gom rác một cách nhanh chóng nếu bạn không giữ một tham chiếu đến nó.
Nhìn chung, lợi thế của bất biến bao la lớn hơn nhiều bất lợi nhỏ. Ngay cả khi bạn chỉ quan tâm đến hiệu suất, các lợi thế đồng thời và tính năng sao chép rẻ tiền nói chung sẽ làm cho các chuỗi bất biến có hiệu suất cao hơn các chuỗi có thể thay đổi được với khóa và sao chép phòng thủ.
http://stackoverflow.com/questions/2365272/why-net-string-is-immutable – Mehrdad
C++ 's std :: string' là * not * không thay đổi. – fredoverflow