属性和变量之间的区别
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您正在使用邪恶的可变结构。
您的问题是属性返回结构的副本,而不是对原始字段的引用。因此您的修改只会影响复制的结构。
在一些简单的情况下(调用设置器)编译器会捕获您的错误。在复杂的情况下(调用改变结构的方法),编译器不会捕获它,并且您的代码将默默地失败(即副本被修改而原始版本保持不变)。
解决方法是使用
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)