修改属性以自动解决“无法修改返回值”错误

时间:2013-08-19 16:29:22

标签: c#

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

假设我有这门课程:

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;

3 个答案:

答案 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>,你明白了......