在使用可变结构和属性时,编译器可以弄清楚一些事情,但对其他相当明显的事情却不能做同样的事情,这对我来说似乎很奇怪。
以下面的自动属性为例:
Vector2 Vector { get; set; }
而不是输入这个:
Vector2 v = Vector;
v += new Vector2(5, 7);
Vector = v;
编译器足够聪明,可以让我这样做:(结构的可变性在这里没有影响)
Vector += new Vector2(5, 7);
但似乎编译器不够聪明,无法让我执行以下操作,即使我可以同时访问 setter 和 getter -
Vector.X += 4;
相反,我被迫“手动”执行此操作-
Vector2 v = Vector;
v.X += 4;
Vector = v;
编译器团队决定允许第一种速记形式而不是第二种速记形式有什么特别的原因吗?
除了建议的方式显然更简洁之外,我还认为它可能允许更有效地内联 NGEN/JIT,因为很明显 getter 生成的副本不会在其他任何地方使用。(仅当这可以以某种方式反映在 IL 代码中时)