2013-08-19 35 views
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); 

但是必須有一種方法來自動化它,對嗎?我並不是說像那樣添加一些屬性,如rect_width等等(因爲我在我的真實類實現中有9個矩形,而且這樣做會很糟糕),但是會使這行代碼有效:

rect.Width += 20; 

回答

3

沒有什麼真的,你可以做些什麼來繞過這個問題,因爲矩形類是不可變的,這就是它的目的是在上班的路上。

但是,您可能使封裝的新的矩形創建一個方法:

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); 
    } 
} 
+0

好吧,就像我在問題中所說,這將是一個壞的舉動,因爲我的類實現中有9個矩形,並且沒有辦法使引用'Rectangle'的常用方法,因爲它們不是引用類型。我想我可以嘗試擴展方法,但我還沒有成功創建任何一個。 – user1306322

+2

@Kenneth System.Drawing.Rectangle是一個結構體。問題不在於它是不可變的(不是),而是它是一個值類型並使用值語義。 –

1

你能做的最好的是一樣的東西rect = rect.AddWidth (20)如使用Rectangle的擴展方法,除非您使rect爲字段或使Rectangle爲(可變)引用類型。這是價值和參考類型之間的核心區別。它不能被規避。與其尋找避開它的方法,你最好閱讀並理解它。

樣品擴展方法:

public static Rectangle AddWidth (this Rectangle r, double x) 
{ 
    r.Width += x ; 
    return r ; 
} 
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>,你看到的點...