变量跟属性之间的这种区别,原因是什么
变量和属性之间的这种区别,原因是什么?
代码如下.... 为什么对变量就有效,对属性调用就无效呢?
公司规范不允许出现public变量,这种情况下我想让属性达到变量的效果,要怎么写呢?
------解决方案--------------------
因为Point是struct,是值类型的。
属性编译后会以函数的形式存在程序中,所以你拿到的p2是个拷贝。
使用方法:声明临时变量temp,修改temp,然后再赋值给p2.
------解决方案--------------------
class MyClass
{
private Point p;
public Point p2 { get this.value; set p2=p; }
}
------解决方案--------------------
p2是个属性,它要通过get方法返回你要访问的Point对象,然后对这个对象做修改
------解决方案--------------------
class MyClass
{
private Point p;
public Point p2 { get {return p}; set {p=p2}; }
}
应该是这样的
------解决方案--------------------
MyClass m = new MyClass();
m.p.Offset(1, 1); //p{1,1}
m.p2 = new Point(0,1);
var tmp = m.p2; //tmp{0,1}
tmp.Offset(1, 2); //tmp{1,3}
m.p2.Offset(1, 2); //p2{0,0}
这么奇怪的问题,其实是因为值类型和引用类型的区别。
------解决方案--------------------
m.p2其实等于var tmp = m.p2;
因为point是指类型这里相当于给一个新的变量赋值,所以offset操作的是tmp。不是p2。
------解决方案--------------------
m.p2.Offset(1, 2); //p2{0,0}
应为:
m.p2.Offset(1, 2); //p2{0,1}
代码如下.... 为什么对变量就有效,对属性调用就无效呢?
公司规范不允许出现public变量,这种情况下我想让属性达到变量的效果,要怎么写呢?
class MyClass
{
public Point p;
public Point p2 { get; set; }
}
[STAThread]
public static void Main()
{
var m = new MyClass();
m.p.Offset(1, 1); //{1,1}
m.p2.Offset(1, 1); //{0,0}
}
------解决方案--------------------
因为Point是struct,是值类型的。
属性编译后会以函数的形式存在程序中,所以你拿到的p2是个拷贝。
使用方法:声明临时变量temp,修改temp,然后再赋值给p2.
------解决方案--------------------
class MyClass
{
private Point p;
public Point p2 { get this.value; set p2=p; }
}
------解决方案--------------------
p2是个属性,它要通过get方法返回你要访问的Point对象,然后对这个对象做修改
private Point _p;
public Point P2
{
get { return _p; }
}
------解决方案--------------------
class MyClass
{
private Point p;
public Point p2 { get {return p}; set {p=p2}; }
}
应该是这样的
------解决方案--------------------
MyClass m = new MyClass();
m.p.Offset(1, 1); //p{1,1}
m.p2 = new Point(0,1);
var tmp = m.p2; //tmp{0,1}
tmp.Offset(1, 2); //tmp{1,3}
m.p2.Offset(1, 2); //p2{0,0}
这么奇怪的问题,其实是因为值类型和引用类型的区别。
------解决方案--------------------
m.p2其实等于var tmp = m.p2;
因为point是指类型这里相当于给一个新的变量赋值,所以offset操作的是tmp。不是p2。
------解决方案--------------------
m.p2.Offset(1, 2); //p2{0,0}
应为:
m.p2.Offset(1, 2); //p2{0,1}