代码之家  ›  专栏  ›  技术社区  ›  Carlos

CLR对不可变结构做什么?

  •  2
  • Carlos  · 技术社区  · 14 年前

    immutable structures

    现在,我想知道CLR是否“知道”某个类型是不可变的,并利用这个事实在运行时做了一些聪明的事情,或者不可变主要是使某些场景更易于编程的事情?

    4 回复  |  直到 14 年前
        1
  •  5
  •   Mark Byers    14 年前

    一般来说,CLR不会对不可变类型做任何特殊的处理。它们的处理方式与任何其他类型相同。

    String.Intern .

        2
  •  2
  •   Jon Hanna    14 年前

    编译器(而不是CLR)有可能在生成IL时巧妙地使用它。我不知道是否有,老实说也不在乎:如果没有,也许将来会有。如果是这样的话,也许将来不会(一个边缘案例显示优化是不明智的。

    我很高兴地想“如果这是只读的,那么编译器(或者CLR)可能会用它做一些聪明的事情,所以这将是一个免费的改进”。这将是一个 自由的 改进,因为我永远不会做一些只读的东西来利用这样的优化,即使我知道它确实这样做,这样的节省是巨大的。我只会把一些东西变成只读的,只要它是只读的。我经常这样做是因为我的风格倾向于大量使用不可变对象,但我只会这样做,因为对象在逻辑上是不可变的,而不是为了追求一些优化而使其不可变,然后不得不绕过不可变性。

    当然,也有一些方法 可以巧妙地处理不可变对象(特别是在计算不同多线程场景对代码的影响时)。

        3
  •  0
  •   Adibe7    14 年前

    在CLR的透视图中,值是可变的。例如:CLR可以更改对象的数据以执行缓存。 结构的用户不能更改它的值,但是CLR可以在几种情况下更改它。这就是为什么CLR不能在自身上实施不变性,也不能在运行时对其进行中继。

        4
  •  0
  •   supercat    13 年前