为什么匿名类型中要使用Getter?

3
为什么要访问匿名类型中的值时,编译器会创建一个getter方法?直接访问只读后备字段不是更容易吗?
2个回答

3
因为匿名类型的属性在构造后是只读的。一旦对象创建,就不能更改它们。
它们可以使用只读属性来实现这一点,但不能使用公共字段(您总是可以更改字段)。
编辑:我找了一下,但没有明显的原因说明他们为什么不使用公共只读字段。然而,我最好的猜测是:所以你可以有属性。
如果它们暴露了公共字段,并且没有任何属性,那么无论如何都会让寻找公共属性的内容无法使用匿名类型,例如WPF绑定。因此,具有私有只读后备字段的属性可能是更安全的选择。

2
请点击这里查看与C#匿名类型属性只读相关的问题。 - Eren Ersönmez
后备字段是只读的,并且从构造函数初始化。我们能否在不使用反射的情况下更改它呢? - user2341923
构造完成后,您无法更改只读字段,除非使用反射。 - Matthew Watson
抱歉,我没有注意到你在问题中提到了只读。我会进行编辑。 - Eren Ersönmez
他们可以使用公共只读字段来实现此操作,这正是OP所问的。 - Matthew Watson

1

不明显的是为什么他们不直接使用只读属性,但一个很好的理由是:

如果他们只使用只读属性,你会知道它的名称,因此很容易使用反射来更改它。

因为他们生成了一个私有的后备字段,所以要知道它的名称要困难得多(你必须检查生成的 IL),因此你使用反射更改它的可能性要小得多。当然,你仍然可以这样做,但这将是一个明显奇怪的事情,你肯定会想一两次才会这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接