我已经读了几篇关于不变性的文章,但仍然没有很好地理解这个概念。
我最近在这里做了一个提到不变性的帖子,但由于这本身就是一个主题,我现在正在制作一个专门的帖子。
我在过去的帖子中提到过,我认为不变性是将对象设为只读并使其具有低可见性的过程。另一位成员表示,这与此没有任何关系。This page (series的一部分)使用了一个不可变的类/结构的例子,它使用只读和其他概念来锁定它。
在本例中,状态的定义到底是什么?状态是一个我还没有真正掌握的概念。
从设计指南的角度来看,不可变的类必须是不接受用户输入并且真正只返回值的类。
我的理解是,任何只返回信息的对象都应该是不可变的和“锁定的”,对吧?因此,如果我想用那个方法在专用类中返回当前时间,我应该使用引用类型,因为这将是该类型的引用,因此我受益于不变性。
发布于 2009-03-07 23:02:57
简单地说:一旦创建了一个不可变的对象,就无法更改该对象的内容。.Net不可变对象的示例包括字符串和Uri。
当你修改一个字符串时,你只是得到了一个新的字符串。原始字符串不会更改。Uri只有只读属性,没有可用于更改Uri内容的方法。
不可变对象很重要的情况多种多样,而且在大多数情况下都与安全性有关。Uri就是一个很好的例子。(例如,您不希望Uri被某些不受信任的代码更改。)这意味着您可以传递对不可变对象的引用,而不必担心内容会发生变化。
希望这能有所帮助。
发布于 2009-03-07 23:23:00
问得好。
多线程。如果所有类型都是不可变的,那么竞争条件就不存在,您可以安全地在代码中抛出任意多个线程。
显然,如果没有可变性,你就不能完成那么多事情,因此你通常需要一些可变性来创建功能强大的业务软件。然而,值得注意的是,不变性应该存在于何处,例如任何事务性。
查找函数式编程和纯洁性的概念,以获得更多关于哲学的信息。您在调用堆栈上存储的(传递给方法的参数)越多,而不是通过引用(如集合或静态可用对象)使它们可用,您的程序就越纯粹,就越不容易出现竞争条件。如今,随着多核的增多,这个话题变得更加重要。
此外,不可变性减少了程序中的可能性,从而减少了潜在的复杂性和潜在的bug。
发布于 2009-03-07 23:03:33
不可变对象是你可以放心地假设它不会改变的东西;它有一个重要的属性,每个使用它的人都可以假设他们看到的是相同的值。
不变性通常还意味着您可以将对象视为一个“值”,并且对象的相同副本和对象本身之间没有有效的区别。
https://stackoverflow.com/questions/622664
复制相似问题