2013-04-21 64 views
0

我有一個問題,當我嘗試重新定位一個面板,例如命名pPan,我得到了兩種不同的方式做到這一點:C#「新」命令

裏面一個按鈕,我寫

pPan.Location = new Point (
    pPan.Location.X +10 , pPan.Location.Y); 

或點擊事件,我可以寫:

pPan.Location.X += 10; 

那麼究竟是什麼的區別就在這裏?爲什麼我要創建這個new Point

回答

2

Location屬性的類型Point是一個結構體。您可能會收到錯誤,如

不能修改 「System.Windows.Forms.Control.Location」的返回值,因爲它不是一個變量

當你設置X,它的Y值。

,但你可以ASIGN新的Point對象:

pPan.Location = new Point (
    pPan.Location.X +10 , pPan.Location.Y); 

Control.Location Property

因爲Point類是值類型(結構在Visual Basic中, 結構在Visual C#),它是通過值返回的,這意味着訪問 屬性會返回控件左上角的副本。因此, 調整從此 屬性返回的Point的X或Y屬性將不會影響該控件的Left,Right,Top或Bottom屬性值 。要調整這些屬性,請分別設置每個屬性 的值,或者使用新的Point設置Location屬性。如果 控件是一個窗體,則位置屬性值表示屏幕座標中窗體的左上角 。

相關SO問題:C# Change the location of an object programmatically

+1

+1,這是正確的答案。 – 2013-04-21 08:32:30

0

不同之處在於第一種方法是爲Point對象分配新的內存。第二種方式是隻改變現有對象的屬性。

儘可能多地操作現有對象是一種很好的做法。所以我建議你用第二種方法來改變位置。

2

如果Pointstruct,則必須使用第一個,因爲當您調用該屬性時,它會返回Location的副本,並嘗試修改副本。

+0

但是,如果它是一個'struct',它不應該有一個屬性setter避免這種混亂(不可變型) – Thorarin 2013-04-21 08:19:28