现在的位置: 首页 > 综合 > 正文

C# 结构的重要差异 初探

2013年09月16日 ⁄ 综合 ⁄ 共 810字 ⁄ 字号 评论关闭

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其等值副本,这点与引用类型是不同的;

 

抱歉!评论已关闭.