C# 结构的重要差异 初探

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值