鉴于这门课...
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 只能从构造函数中设置,因此是只读的?
不,编译器不会这样做。该字段的 IL 代码将如下所示:
.field private int64 _id
...而只读版本将获得此 IL 代码:
.field private initonly int64 _id
编译器不可能知道某个字段仅在构造函数中设置。想象一下,例如在某种方法中使用反射,其中字段的名称是从数据库中读取的。如果您希望字段不可变,则需要显式指定
readonly
关键字。