2011-09-22 65 views
1

我有一個屬性包圍我稱之爲窗口的矩形。 當我嘗試使用該屬性更改矩形的位置或「X」值時,出現錯誤:「無法修改Window的返回值,因爲它不是變量。」你如何寫一個屬性,以便你可以訪問內部變量?

現在我知道我可以直接訪問變量,但我更願意只能修改「X」值。我也不想在每次修改它時創建一個新的矩形。

那麼有什麼我可以添加到我的財產,讓我通過屬性修改X值?

這是我試圖使用屬性:

Window.X -= amount; 

這是我有proprty:

private Rectangle _window; 
public Rectangle Window 
{ 
    get { return _window;} 
    set 
    { 
     if (/*condition*/) 
      _window = value; 
    } 
} 

回答

7

問題是,Rectanglestruct。屬性訪問器實際上是一種方法,當它返回結構體時,它只是被複制,所以你不能以這種方式修改底層結構體。

解決方案:

  1. 如果矩形是你的代碼使之類。
  2. r = Window; r.X -= amount; Window = r;

通過你應該感謝的是C#編譯器,becase的技術上它可以修改X的方式,但它會現場/臨時對象的道具,它將使以後調試你一個地獄。在C++中它實際上編譯。

這也是爲什麼結構應該是不可變的很好的例子。你只是不會有這種誘惑。

+0

謝謝如果編譯可以隱式地執行這些步驟可以把它看作一個不可變的對象,那麼它會像字符串 – OrangeKing89

1

Rectangle是一個struct - 因此您的財產返回,而不是一個變量。

0

它不起作用,因爲System.Drawing.Rectangle被定義爲一個struct(值類型)。

這是不允許的,因爲當你引用屬性時,你會得到一個值(結構)的副本。因此,在結構上分配X屬性會影響Window屬性。

相關問題