博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结构(值类型)的构造器
阅读量:5332 次
发布时间:2019-06-15

本文共 1346 字,大约阅读时间需要 4 分钟。

  1. internal struct Point{  
  2.     public Int32 m_x, m_y;  
  3. }  
  4. internal sealed classs Rectangle {  
  5.     public Point m_topLeft, m_bottomRight;  
  6. }  

 

在构造Rectangle时候,需要使用new 显式调用C#编译器自动生成的默认构造器。在为Rectangle分配内内存时,由于性能问题,不会为主动调用包含在内的每个值类型字段的构造器。值类型的字段会被初始化为0或null。

 

  1. internal struct Point  
  2. {  
  3.     public Int32 m_x, m_y;  
  4.     
  5.     public Point(int32 x, Int32 y)  
  6.     {  
  7.         m_x = x;  
  8.         m_y = y;  
  9.     }  
  10. }  
  11.     
  12. internal sealed class Rectangle  
  13. {  
  14.     public Point m_topLeft, m_bottomRight;  
  15.     public Rectangle()  
  16.     {  
  17.         m_topLeft = new Point(1, 2);  
  18.         m_bottomRight = new Point(100, 200);  
  19.     }  
  20. }

值类型的构造器 只有显示调用才会执行;

  1. internal struct Point  
  2. {  
  3.     public Int32 m_x, m_y;  
  4.     
  5.     public Point()  
  6.     {  
  7.         m_x = m_y = 5;  
  8.     }  
  9. }  
  10.     
  11. internal sealed class Rectangle  
  12. {  
  13.     public Point m_topLeft, m_bottomRight;  
  14.     public Rectangle() {  
  15.     }  

上述还是不会调用,Point的无参构造器,编译器不会自动生成代码调用。这里会报错 error CS0568:结构不能包含显示的无参数构造器;

 

由于没有无参数构造器,下例也是无法执行

  1. internal struct SomeValType  
  2. {  
  3.     //不能在值类型值内敛实例字段的初始化  
  4.     private Int32 m_x = 5;  
  5. }  

    在访问值类型的任何字段之前,都需要对全部字段进行赋值。所以,值类型的任何构造器都必须初始化值类型的全部字段。

  1. internal struct SomeValType  
  2. {  
  3.     private Int32 m_x, m_y;  
  4.     //不能在值类型值内敛实例字段的初始化  
  5.    public SomeValType(Int32 x)  
  6.     {  
  7.         m_x = x;   
  8.         //m_y没有进行初始化  
  9.     }  
  10. }  

    上例由于没有给m_y赋值所以会报错。

     

  11. public SomeValType(Int32 x)  
  12. {  
  13.     //会将所有字段初始化化为0/null  
  14.     this = new SomeValType();  
  15.     
  16.     m_x = x;  
  17.     //覆盖 m_x0  
  18.     //m_y已经初始化为0  
  19. 在值类型的构造其中,this代表值类型的本身的一个实例,用new创建的值类型的一个实例可以赋给this。在new的过程中,会将所有字段重置为零。而在引用类型的构造器中,this为只读的,所以不能对它进行赋值。

转载于:https://www.cnblogs.com/ILoveMyJob/p/10809645.html

你可能感兴趣的文章
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
python的猴子补丁monkey patch
查看>>
架构模式: API网关
查看>>
正则验证积累
查看>>
Linux学习-汇总
查看>>
jQuery瀑布流+无限加载图片
查看>>
83. 删除排序链表中的重复元素
查看>>
bzoj1048 [HAOI2007]分割矩阵
查看>>
python中的__init__ 、__new__、__call__等内置函数的剖析
查看>>
Java中的编码
查看>>
PKUWC2018 5/6
查看>>
As-If-Serial 理解
查看>>
MYSQL SHOW VARIABLES简介
查看>>
雷林鹏分享:Redis 简介
查看>>
自卑都是自己不踏实做事的表现
查看>>
C# 网页自动填表自动登录 .
查看>>
netfilter 和 iptables
查看>>
洛谷P1005 矩阵取数游戏
查看>>
Django ORM操作
查看>>
2012年最佳30款免费 WordPress 主题
查看>>