属性和变量之间的区别

Ser*_*gey 2 c# struct mutable

class MyClas
{
   public System.Windows.Point p;
   public void f()
   {
      p.X = 0;
   }
}
Run Code Online (Sandbox Code Playgroud)

这段代码完美无缺.

同时这个导致编译错误("无法修改p的返回值,因为它不是变量"):

class MyClas
{
   public System.Windows.Point p {get; set;}
   public void f()
   {
      p.X = 0;
   }
}
Run Code Online (Sandbox Code Playgroud)


有什么不同?

Cod*_*aos 7

你正在使用一个邪恶可变结构.

您的问题是属性返回结构的副本,而不是对原始字段的引用.因此,您的修改只会影响复制的结构.
在一些简单的情况下(调用setter),编译器会捕获你的错误.在复杂的情况下(调用一个改变结构的方法),编译器不会捕获它,你的代码将无声地失败(即副本被修改而原始文件保持不变).

解决方法正在使用 p=new Point(x,y)