首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么是不变性,我为什么要担心它?

什么是不变性,我为什么要担心它?
EN

Stack Overflow用户
提问于 2009-03-07 22:50:06
回答 9查看 9.5K关注 0票数 59

我已经读了几篇关于不变性的文章,但仍然没有很好地理解这个概念。

我最近在这里做了一个提到不变性的帖子,但由于这本身就是一个主题,我现在正在制作一个专门的帖子。

我在过去的帖子中提到过,我认为不变性是将对象设为只读并使其具有低可见性的过程。另一位成员表示,这与此没有任何关系。This page (series的一部分)使用了一个不可变的类/结构的例子,它使用只读和其他概念来锁定它。

在本例中,状态的定义到底是什么?状态是一个我还没有真正掌握的概念。

从设计指南的角度来看,不可变的类必须是不接受用户输入并且真正只返回值的类。

我的理解是,任何只返回信息的对象都应该是不可变的和“锁定的”,对吧?因此,如果我想用那个方法在专用类中返回当前时间,我应该使用引用类型,因为这将是该类型的引用,因此我受益于不变性。

EN

回答 9

Stack Overflow用户

发布于 2009-03-07 23:02:57

简单地说:一旦创建了一个不可变的对象,就无法更改该对象的内容。.Net不可变对象的示例包括字符串和Uri。

当你修改一个字符串时,你只是得到了一个新的字符串。原始字符串不会更改。Uri只有只读属性,没有可用于更改Uri内容的方法。

不可变对象很重要的情况多种多样,而且在大多数情况下都与安全性有关。Uri就是一个很好的例子。(例如,您不希望Uri被某些不受信任的代码更改。)这意味着您可以传递对不可变对象的引用,而不必担心内容会发生变化。

希望这能有所帮助。

票数 9
EN

Stack Overflow用户

发布于 2009-03-07 23:23:00

问得好。

多线程。如果所有类型都是不可变的,那么竞争条件就不存在,您可以安全地在代码中抛出任意多个线程。

显然,如果没有可变性,你就不能完成那么多事情,因此你通常需要一些可变性来创建功能强大的业务软件。然而,值得注意的是,不变性应该存在于何处,例如任何事务性。

查找函数式编程和纯洁性的概念,以获得更多关于哲学的信息。您在调用堆栈上存储的(传递给方法的参数)越多,而不是通过引用(如集合或静态可用对象)使它们可用,您的程序就越纯粹,就越不容易出现竞争条件。如今,随着多核的增多,这个话题变得更加重要。

此外,不可变性减少了程序中的可能性,从而减少了潜在的复杂性和潜在的bug。

票数 3
EN

Stack Overflow用户

发布于 2009-03-07 23:03:33

不可变对象是你可以放心地假设它不会改变的东西;它有一个重要的属性,每个使用它的人都可以假设他们看到的是相同的值。

不变性通常还意味着您可以将对象视为一个“值”,并且对象的相同副本和对象本身之间没有有效的区别。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/622664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档