对此可能有一个非常合乎逻辑的解释,但我有一个问题。
假设我有一个名为_rect的Rectangle类型的变量。我现在可以说_rect.X = 50;没有任何问题。
现在我有一个带有一个名为Rect的属性的类,它暴露了内部变量_rect。
然后,如果我尝试编写Rect.X = 50;
,我会收到以下编译错误:
无法修改'TestClass.Rect'的返回值,因为它不是变量。
我可以编写Rect = new Rectangle( 50, Rect.Y, Rect.Width, Rect.Height)
类似于不可变类型,但对于非不可变类型,还有其他方法吗?
我想对这个矩形字段使用自动属性,但是真的很烦人,无法在类本身内部修改它。
是否有任何方法没有制作支持字段并放弃自动属性?
答案 0 :(得分:10)
此错误的原因是因为Rectangle是值类型(struct),与引用类型(类)相反。您无法修改X
属性,因为当您使用Rect
属性getter时,将返回矩形的新值(getter是一个函数)。如果它是一个引用类型,你正在操纵指针,这是可能的。
这是值与参考类型有关的重要方面。
答案 1 :(得分:1)
访问该属性实际上是一个函数调用,它返回值类型的副本。 Rect.X = 50;只会修改这个临时副本,而不是修改支持字段本身。
当属性未自动实现时,您可以创建一个附加属性RectX,可用于获取和设置矩形的X属性。
答案 2 :(得分:0)
答案 3 :(得分:0)
class RectangleWithoutFields
{
// just autoproperties, no fields
public int X { get; set; }
public int Y { get; set;}
public RectangleWithoutFields()
{
X = 0;
Y = 0;
}
public void ChangeProperties(int x, int y)
{
X = x;
Y = y;
}
}