2013-04-21 69 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