class A{
internal int k;
}
struct B{
internal int k;
}
class Test{
internal A a;
internal B b;
//
internal A Ap{get;set;}
internal B Bp{get;set;}
}
下面 我要为大家构造一个关于结构的错误,
构造这个错误(异常CS1612)之前 先来看看类的情况
//
using System;
class Program{
static void Main(){
Test t=new Test();
t.Ap=new A();
t.Ap.k=33; //ok
}
}
//
上述代码没问题 因为 属性Ap装的是一个类对象,
下面 依照上面模式 换成结构的情况 则可构造出一个异常
//
using System;
class Program{
static void Main(){
Test t=new Test();
t.Bp=new B();
t.Bp.k=33; // erorr CS1612 ....S1处
//但是
t.b.k=33; //OK ....S2处
}
}
//
这说明了什么呢?究竟?
其实是这样的
S1处 相当于 t.Bp.get(){return __b;}
这里 __b实际上是代表编译器里面的维护的变量,我们看到,实际上 属性访问是通了get方法进行的,而get方法 返回的是一个编译器为Test类维护的一个结构型成员变量,当通过 return __b时,我们 可以理解__b他本身不是引用,而是一个B结构所以return __b的结构是 返回了这一个与__b值完全相同的临时副本. 而这就是S1处 CS1612异常的原因,你检查这个异常在MSDN上 也可进一步证实上述分析.
也就可以总结为 在向方法传递结构或返回结构时都只是COPY其等值副本,这点与引用类型是不同的;