变量跟属性之间的这种区别,原因是什么

变量和属性之间的这种区别,原因是什么?
代码如下....  为什么对变量就有效,对属性调用就无效呢?
公司规范不允许出现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} 

这么奇怪的问题,其实是因为值类型和引用类型的区别。
------解决方案--------------------
引用:
 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。
------解决方案--------------------
引用:
 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.Offset(1, 2);          //p2{0,0} 
应为:
 m.p2.Offset(1, 2);          //p2{0,1}