不可变性对非并行应用程序有用吗?

Joa*_*nge 8 .net c# performance immutability

我喜欢不变性概念,但有时我想知道,当一个应用程序不是平行的时候,应该避免让事情变得不可变吗?

当应用程序不是多线程的时,您不会受到共享状态问题的困扰,对吧?

或者不变性是像OOP这样的概念,你要么一直使用?排除基于使用/性能等因素不应该不可变的情况.

在为自己编写应用程序时,我遇到了这个问题,这个问题是适度的(可能像1-2k行).

Arn*_*psa 9

我喜欢不可变性的优势,你只需要在创建对象时验证它一次.实际上这是一个巨大的奖金.

  • 好点子.这个想法也有安全隐患.假设您将可变对象X传递给方法Foo.Foo检查X以确保X是Foo的有效参数,如果不是则抛出,然后根据X进行一些安全敏感操作.如果恶意调用者在参数检查后可以在另一个线程上改变X,则参数检查可以有效地被绕过!这是字符串在.NET中不可变的一个原因 - 您希望能够说"打开此文件",对该路径执行安全检查,并且知道路径字符串在检查和文件打开之间不会更改. (6认同)

Jar*_*Par 8

我喜欢不变性,因为这意味着我不必相信其他人的代码,不要乱用我希望保持不变的对象.

当您将一个对象传递给另一个组件(如a)时List<T>,您将受到该组件所做的那样的支配.将集合作为属性返回时,这一点尤其重要.

public class Foo { 
  private List<Bar> _barList;
  public ICollection<Bar> BarList { get return _barList; } 
}
Run Code Online (Sandbox Code Playgroud)

没有什么可以阻止这个类的消费者清除我下面的集合.即使将返回类型切换到IEnumerable<Bar>也不完全安全.没有什么可以阻止某些编写错误的代码将其转换回List<T>并调用.Clear().

但是,如果我真的希望该集合保持一致,我可以将其重写为followis

public class Foo {
  private ImmutableCollection<Bar> _barList;
  public ImmutableCollection<Bar> BarList { get { return _barList; } }
}
Run Code Online (Sandbox Code Playgroud)

现在我不必相信其他代码错误地使用我的类.他们不能弄乱它.