为什么字符串在许多编程语言中是不可变的?
2022-08-31 14:59:06
为此选择了几种语言,例如C#,Java和Python。如果它的目的是节省内存或提高比较等操作的效率,那么它对串联和其他修改操作有什么影响?
为此选择了几种语言,例如C#,Java和Python。如果它的目的是节省内存或提高比较等操作的效率,那么它对串联和其他修改操作有什么影响?
不可变类型通常是一件好事:
因此,使字符串不可变是一个非常合理的语言设计选择。
一些语言(特别是像Haskell和Clojure这样的函数式语言)走得更远,使几乎所有东西都是不可变的。如果您对不可变性的好处感兴趣,这个启发性视频非常值得一看。
不可变类型有几个小缺点:
但总的来说,不变性的优点远远超过了次要的缺点。即使您只对性能感兴趣,复制的并发优势和廉价性通常也会使不可变字符串比具有锁定和防御性复制的可变字符串性能更高。
它主要用于防止编程错误。例如,字符串经常用作哈希表中的键。如果它们可以更改,则哈希表将损坏。这只是一个例子,当你使用一段数据时,它会导致问题。安全性是另一回事:如果您在执行用户请求的操作之前检查是否允许用户访问给定路径上的文件,则包含该路径的字符串最好不是可变的...
当您进行多线程处理时,它变得更加重要。不可变数据可以在线程之间安全地传递,而可变数据会引起无休止的麻烦。
基本上,不可变数据使处理它的代码更容易推理。这就是为什么纯粹的函数式语言试图保持一切不可变。