属性和变量之间的区别

发布于 2024-10-05 02:48:49 字数 341 浏览 5 评论 0原文

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;
   }
}


有什么区别?

class MyClas
{
   public System.Windows.Point p;
   public void f()
   {
      p.X = 0;
   }
}

This code works perfectly.

At the same time this one causes compilation error ("Cannot modify the return value of p because it is not a variable"):

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

What's the difference?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧情勿念 2024-10-12 02:48:49

您正在使用邪恶的可变结构

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

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

You're using a mutable struct which is evil.

Your problem is that a property returns a copy of the struct, and not a reference to the original field. So your modifications would only affect the copied struct.
In some simple cases(calling setters) the compiler catches your mistake. In complex cases(calling of a method which mutates the struct) the compiler doesn't catch it and your code will silently fail(i.e. the copy gets modified and the original remains unchanged).

The workaround is using p=new Point(x,y)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文