0

我想知道是否有内置或易于实现的方法来处理这个“无法修改返回值,因为它不是变量”问题。

假设我有这个课程:

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;
4

3 回答 3

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);
    }
}
于 2013-08-19T16:33:51.060 回答
1

您可以做的最好的事情就是rect = rect.AddWidth (20)例如在 上使用扩展方法Rectangle,除非您创建rect一个字段或创建Rectangle一个(可变)引用类型。这是值类型和引用类型之间的核心区别。它无法被规避。与其寻找规避它的方法,不如阅读并理解它。

示例扩展方法:

public static Rectangle AddWidth (this Rectangle r, double x)
{
    r.Width += x ;
    return r ;
}
于 2013-08-19T16:32:51.597 回答
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>,你明白这一点......

于 2013-08-19T16:48:57.653 回答