日期:2014-05-16  浏览次数:20861 次

C# 类与结构体的区别(属性与变量)
定义一个结构体MyStruct,

 public struct MyStruct
    {
      public int a ;
      public int b;
    }

public class MyClass
    {
       public MyStruct mm_Struct = new MyStruct();//变量
      
       public MyStruct Struct //属性
       {
           get{return mm_Struct;} 
           set{mm_Struct=value;}
       }
    }

写代码时:
            MyClass m_class = new MyClass();
            
            m_class.mm_Struct.b = 9;
            m_class.Struct.b = 9;

最后一个代码提示
    “ 错误 1 无法修改“WindowsFormsApplication1.MyClass.Struct”的返回值,因为它不是   变量”

本人新人,希望大家指教

------解决方案--------------------
 m_class.Struct返回了一个结构的拷贝,而拷贝上作改变没有意义,因此编译器给出错误信息。
可以改为写回整个结构。

var s = m_class.Struct;
s.b = 9;
m_class.Struct = s;

------解决方案--------------------
m_class.mm_Struct.b = 9;
调用的是get而不是set
相当于如下代码:
x = m_class.get_mm_Struct();
x.b = 9;
------解决方案--------------------
引用:
其实总结一下问题就是:通过成员变量访问到结构体实例时,可以设置它的成员值;通过属性访问到结构体实例时,就不能设置它的成员值了;

不要这么总结。
本质是值类型传递的是副本,引用类型传递的是引用。
这里所说的传递,包括了方法的调用以及return。

就是说
void a(MyStruct m){}

a(new MyStruct());

上面方法体里面的m和外面的MyStruct对象不是同一个,而是外面那个对象的副本。
同理
void MyStruct a(){return new MyStruct();}

MyStruct ms = a();

ms和return的MyStruct对象不是同一个,而是副本而已。