.Net 中编译器实现的不变性

问题描述 投票:0回答:2

鉴于这门课...

public class Test
{
  private long _id;

  public Test(long id)
  {
    _id = id;
  }
}

.Net 编译器实际上会将其编译为...

public class Test
{
  private readonly long _id;

  public Test(long id)
  {
    _id = id;
  }
}

换句话说,它是否理解 _id 只能从构造函数中设置,因此是只读的?

.net immutability readonly
2个回答
4
投票

不,编译器不会这样做。该字段的 IL 代码将如下所示:

.field private int64 _id

...而只读版本将获得此 IL 代码:

.field private initonly int64 _id

2
投票

编译器不可能知道某个字段仅在构造函数中设置。想象一下,例如在某种方法中使用反射,其中字段的名称是从数据库中读取的。如果您希望字段不可变,则需要显式指定

readonly
关键字。

© www.soinside.com 2019 - 2024. All rights reserved.