浅谈C#结构

发表于:2011-9-27 09:23

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佳园(cnblogs)    来源:51Testing软件测试网采编

  结构的静态构造函数何时将触发呢?结构的实例成员被引用,结构的静态成员被引用,结构显示声明的构造函数被调用。但是创建结构类型的默认值不会触发静态构造函数。

  为什么结构不能自定义无参数的构造函数?

  结构类型的构造函数与类的构造函数类似,用来初始化结构的成员变量,但是struct不能包含显式默认构造函数,

  因为编译器将自动提供一个构造函数,此构造函数将结构中的每个字段初始化为默认值表中显示的默认值。

  然而,只有当结构用new实例化时,才会调用此默认构造函数。对值类型调用默认构造函数不是必需的。

  • structA  
  • {staticA()  
  • {  
  • Console.WriteLine("I am A.");  
  • }publicvoidFun()  
  • {  
  • }  
  • }classProgram  
  • {staticvoidMain(string[] args)  
  • {  
  • A a=newA();  
  • a.Fun(); //结构的实例成员被引用  
  • Console.Read();  
  • }  
  • }
  •   结果为:I am A.

      结构与继承:

      一个结构声明可以指定实现的接口列表,但是不能指定基类。

      由于结构不支持类与结构的继承,所以结构成员的声明可访问性不能是protected或protectedinternal。结构中的函数成员不能是abstract或 virtual,因而override修饰符只适用于重写从System.ValueType继承的方法。

      为在设计编程语言时将结构设计成无继承性?

      其实类的继承是有相当的成本的 ——由于继承性,每个类需要用额外的数据空间来存储“继承图”来表示类的传承历史,

      通俗地说来就是我们人类的家族家谱,里面存储着我们的祖宗十八代,只有这样我们才知道我们从哪里来的,而家谱肯定是需要额外的空间来存放的。

      大家不要觉得这个存放“继承图”的空间很小,如果我们的程序需要用10000个点(Point)来存放游戏中的人物形体数据的话,

      在一个场景中又有N个人,这个内存开销可不是小数目了。所以我们可以通过将点(Point)申明成 Struct而不是class来节约内存空间。interfaceITest

  • {voidFun(intx,inty);  
  • }structA:ITest  
  • {publicvoidFun(intx,inty) //隐式实现接口里的方法  
  • {  
  • Console.WriteLine("x={0},y={1}", x, y);  
  • }  
  • }classProgram  
  • {staticvoidMain(string[] args)  
  • {  
  • A a; //结构的实例化可以不使用new  
  • a.Fun(1, 2);  
  • Console.Read();  
  • }  
  • }  
  • // 结果为:x=1,y=2
  •   什么情况下结构的实例化可以不使用new?

      当结构中没有参数时,结构的实例化可以不使用new;当结构中有参数时,必须对结构中所有参数进行初始化后,才能不使用new对结构进行实例化。什么时候使用结构?

      结构体适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主;

      例如:struct类型适于表示Point、Rectangle和Color等轻量对象。

      尽管可以将一个点表示为类,但在某些情况下,使用结构更有效。

      如果声明一个10000个Point对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。

      定义的时候不会用到面向对象的一些特性;

      结构体在不发生装箱拆箱的情况下性能比类类型是高很多的。

    22/2<12
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号