class MyClas
{
public System.Windows.Point p;
public void f()
{
p.X = 0;
}
}
此代码完美无缺。
同时这个导致编译错误(“无法修改p的返回值,因为它不是变量”):
class MyClas
{
public System.Windows.Point p {get; set;}
public void f()
{
p.X = 0;
}
}
有什么区别?
答案 0 :(得分:7)
您使用的是mutable struct which is evil。
您的问题是属性返回结构的副本,而不是对原始字段的引用。因此,您的修改只会影响复制的结构 在一些简单的情况下(调用setter),编译器会捕获你的错误。在复杂的情况下(调用一个改变结构的方法),编译器不会捕获它,你的代码将无声地失败(即副本被修改而原始文件保持不变)。
解决方法是使用p=new Point(x,y)