2012-08-03 72 views
0

我有這樣的如何設置屬性的成員?

public Vector2 TestVector 
    { 
     get { return testvector; } 

     set 
     { 
      testvector = value; 

     } 
    } 

的Vector2有成員X和Y載體的性質

當我想設置property.x和property.y到價值觀,這是行不通的

// this does not work 
TestVector.X = 10; 

我該如何解決這個問題?

編輯:我看到我正在得到答案,說它是一個結構,但實際上我有一個名爲dVector2的類,它是一個類類型而不是結構體,我使用它。爲了簡單起見,我只在這裏放置了vector2,但是這樣做反而失敗了。

+1

對於「不起作用」的解釋,唯一的建議是「以某種方式修正它*」。任何特殊的例外?或者VS只是說你「我不會工作」? – zerkms 2012-08-03 02:33:40

回答

1

提到的另一個解決方案是沒有人來只是讓X和存取方法你有每個向量的Y。

Public float TestVectorX 
{ 
    get { return TestVector.X; } 
    set { TestVector.X = value; } 
} 

Public float TestVectorY 
{ 
    get { return TestVector.Y; } 
    set { TestVector.Y = value; } 
} 

增加了一些代碼,但不會每次都或使其完全公開的丟失封裝,宣佈了新的載體的額外內存。

5

Vector2是一個struct(值類型)。因此,這裏是正在發生的事情,當你試圖TestVector.X = 10

{ 
    Vector2 temp = get_TestVector(); // copy is made during return from 
             // hidden call to property getter method 

    temp.X = 10;      // modifying the copy 

             // copy is gone 
} 

最終的結果是,沒有任何反應

不幸的解決方案是:

TestVector = new Vector2 { X = 10, Y = TestVector.Y }; 

另一種解決方案,這可能是你的情況適合,是簡單地讓TestVector公共領域,而不是一個屬性:

public Vector2 TestVector; 
0

@Jonathon打我指出你有一個結構。

我想補充一點,一般來說,有一個可變的結構是不明智的。這會由於價值語義而導致各種各樣的複雜情況。

一旦結構得到它的初始值,它們應該是不可更改的(即沒有公共setters等)。

如果您使用C#結構,它應該是不可變的。可變的結構會導致各種令人討厭的問題;不要這樣做。如果我必須設計C#語言,我會說可變結構必須用'可變'關鍵字標記。

http://blogs.msdn.com/b/jaybaz_ms/archive/2004/06/10/152748.aspx

+0

責備XNA框架。但同樣的問題存在於['Point'](http://msdn.microsoft.com/en-us/library/system.drawing.point.aspx)結構中,等等。 – 2012-08-03 02:39:17

+0

你說得對*一般*說話可變結構最好避免。然而,在遊戲開發環境(如XNA)中,這是一個必要的罪惡 - 通常出於性能方面的原因(我們無法繞過創建堆對象,而且我們使用緩衝區以特定方式工作)。 – 2012-08-03 06:40:40

+0

如果你花時間充分理解它們的語義,那麼可變結構就不是「邪惡」的。只是它們的行爲與普通開發人員所期望的完全不同,這會導致問題。我閱讀了一篇關於.NET Framework關鍵部分的設計討論的博客文章,該文章經歷了類似的性能討論。它與線程信號有關,但我不記得確切的上下文或鏈接。他們的底線是一樣的......如果你需要最後一盎司的表現,在適當的地方使用結構,並確保每個在代碼上工作的人都能真正理解他們。 – 2012-08-03 21:22:55