我有一个属性,包含一个我称之为Window的矩形。 当我尝试使用属性来更改矩形的位置或“X”值时,我收到一个错误:“无法修改Window的返回值,因为它不是变量。”
现在我知道我可以直接访问变量,但我更愿意只修改“X”值。我也不想每次修改它时都要创建一个新的矩形。
那么我可以添加到我的属性中,让我通过属性修改X值吗?
这是我尝试使用该属性的地方:
Window.X -= amount;
这是我有自己的地方:
private Rectangle _window;
public Rectangle Window
{
get { return _window;}
set
{
if (/*condition*/)
_window = value;
}
}
答案 0 :(得分:7)
问题是Rectangle
是struct
。属性访问器实际上是一个方法,当它返回struct时,它只是被复制,所以你不能这样修改底层结构。
解决方案:
r = Window; r.X -= amount; Window = r;
顺便说一句,你应该感谢C#编译器,因为从技术上讲它可以修改那个X,但它会是临时对象的字段/道具,它会让你以后调试地狱。在C ++中,它实际上是编译的。
同样很好的例子,为什么结构应该是不可变的。你不会有这种诱惑。
答案 1 :(得分:1)
Rectangle
是struct
- 因此您的属性会返回值,而不是变量。
答案 2 :(得分:0)
它不起作用,因为System.Drawing.Rectangle
被定义为结构(值类型)。
这是不允许的,因为当您引用该属性时,您将获得值(struct)的副本。因此,在struct上分配X属性会对Window属性产生影响。