我想知道是否有内置或易于实现的方法来处理“无法修改返回值,因为它不是变量”问题。
假设我有这门课程:
MyClass
{
Rectangle _rect = new Rectangle(1, 2, 3, 4);
public Rectangle rect { get { return _rect; } set { _rect = value; } }
}
这就是我要做的事情:
rect.Width += 20; // and this is where the error pops up
通常的方法是这样做:
rect = new Rectangle(rect.X, rect.Y, rect.Width + 20, rect.Height);
但必须有一种自动化方法,对吗?而且我并不是说只需要向MyClass
添加一堆属性就像rect_width
这样(因为我在我的真实类实现中有9个矩形,这会很糟糕),但是使这行代码工作:
rect.Width += 20;
答案 0 :(得分:3)
由于Rectangle类是不可变的并且是它的工作方式,因此没有什么可以解决问题。
但是,您可以公开一个封装新矩形创建的方法:
MyClass
{
Rectangle _rect;
public Rectangle rect { get { return _rect; } set { _rect = value; } }
public void AddWidth(int width)
{
rect = new Rectangle(rect.X, rect.Y, rect.Width + width, rect.Height);
}
}
答案 1 :(得分:1)
您可以做的最好的事情就像是rect = rect.AddWidth (20)
,例如使用Rectangle
上的扩展方法,除非您将rect
设为字段或使Rectangle
成为(可变)引用类型。这是值和引用类型之间的核心差异。它无法被规避。你最好先阅读并理解它,而不是寻找绕过它的方法。
示例扩展方法:
public static Rectangle AddWidth (this Rectangle r, double x)
{
r.Width += x ;
return r ;
}
答案 2 :(得分:0)
您还可以定义自己的MyRectangle
类来重新定义矩形的属性,如下所示:
public class MyRectangle
{
private System.Drawing.Rectangle rect;
public MyRectangle(int x, int y, int width, int height)
{
this.rect = new System.Drawing.Rectangle(x, y, width, height);
}
public int X
{
get
{
return rect.X;
}
set
{
this.rect = new System.Drawing.Rectangle(value, rect.Y, rect.Width, rect.Height);
}
}
public int Y
{
get
{
return rect.Y;
}
set
{
this.rect = new System.Drawing.Rectangle(rect.X, value, rect.Width, rect.Height);
}
}
public int Width
{
get
{
return rect.Width;
}
set
{
this.rect = new System.Drawing.Rectangle(rect.X, rect.Y, value, rect.Height);
}
}
public int Height
{
get
{
return rect.Height;
}
set
{
this.rect = new System.Drawing.Rectangle(rect.X, rect.Y, rect.Width, value);
}
}
public System.Drawing.Rectangle Rectangle
{
get
{
return rect;
}
}
}
您还可以将其他属性重新定义为内部Rectangle(如Bottom
)甚至某些方法的包装器。或者甚至将它IComparable<Rectangle>
,你明白了......