C语言c#之结构体

 
 struct是如出一辙种植复合值类型,通常用来封装小型变量组,其中每个变量为布局的积极分子。

 C#惨遭组织类型及类项目在语法上格外相像,他们都是一样种植多少结构,都可以概括数据成员与办法成员。

  结构及类似的分:

  1、结构是值类型,它于栈中分配空间;而类似是引用类型,它当积着分配空间,栈中保存之只是是援。

  2、结构类型直接存储成员数量,让其他类的数码在堆着,位于栈中的变量保存的是因于堆着数对象的援。

  C#丁的简便类型,如int、double、bool等都是构造类型。如果需要的话,甚至好动用结构类型结合运算符运算重载,再为C#语言创建有一致栽新的值类型来。

  由于组织是值类型,并且一直存储数据,因此在一个对象的重要性成员也数都数据量不慌的景象下,使用结构会带动更好之属性。

一样、声明结构的语法 – struct关键字

    public struct AddressBook
    { 
        //字段、属性、方法、事件
    }

  对于类似而言,两单变量指向同一个靶的情是是的,因此对这么点滴独变量中之任性一个进行操作,起结果必然会影响另外一个,因为她对的是与一个目标。

  结构是值类型,,直接包含它自己的数额,每个组织都封存好的平等卖数据,修改每一个结构的数都无见面指向其余组织的数码造成影响。

老二、给组织赋值

  如果起结构被开创一个目标,并拿拖欠对象给予给某个变量,则该变量包含结构的整整价值。复制类型也组织的变量时,将以复制该组织所拥有的享有数据。由于组织不是引用类型,因此结构类型的变量不能够让给予null值。

C语言 1

public class Program
    {
        static void Main(string[] args)
        {
            PersonStruct p1, p2;    //与类一样,但可以不new
            p1.Name = "张飞";
            p1.MobilePhone = "13553663108";
            p1.Birthday = DateTime.Now.AddYears(-10);

            p2 = p1;              //将p1的值赋给p2   //由于是值类型,因此赋值等于将全部值全部复制到p2的栈空间
            p2.Name = "关羽";     //然后修改p2的值看是否会影响p1
            Console.WriteLine(p1.Name);     //输出 张飞 没影响

            PersonClass p3 = new PersonClass();    
            p3.Name = "张飞";
            p3.MobilePhone = "13553663108";
            p3.Birthday = DateTime.Now.AddYears(-10);

            PersonClass p4 = new PersonClass();
            p4 = p3;              //将p3的值赋给p4   赋值后,由于是引用类型,因此两个对象指向的是同一个地址(堆空间)
            p4.Name = "关羽";     //然后修改p4的值看是否会影响p3
            Console.WriteLine(p3.Name);     //输出 关羽 没影响

            Console.ReadKey();
        }
    }

    public class PersonClass
    {
        public string Name;
        public string MobilePhone;
        public DateTime Birthday;
    }

    public struct PersonStruct
    {
        public string Name;
        public string MobilePhone;
        public DateTime Birthday;
    }

C语言 2

  将一个组织变量赋值给任何一个布局变量,就是把多少由一个构造复制到其它一个布局。而接近则不同,在看似的变量之间,复制的是援引,而无是看似数据。。因此当数较坏之时光,这种数量复制机制会带比较生的付出。

其三、构造函数

  结构类型可以出实例构造函数和静态构造函数,但未可知闹析构函数。

  1、实例构造函数

  结构类型且产生一个预定义的,没有参数的构造函数,这点以及类似是一样的。本条构造函数不容许删除和重定义,并且这无参数的构造函数会直接存在,并无会见因定义了另外带参数的构造函数就烟消云散,这一点跟相近不同。

   小心要没有利用new运算符,是无得以使用数据成员的价(除非已显地安装了拖欠数据成员的价)和调用函数成员的(除非有数据成员全就让赋值)。

季、静态构造函数

  和好像一样,结构类型也得以生出静态构造函数,静态构造函数用于初始化静态数据成员。静态构造函数有如下特征:

  1、静态构造函数不克出看修饰符和参数;

  2、静态构造函数不克看实例成员;

  3、静态构造函数无法直接开展调用;

  结构与类似的静态构造函数的触发规则不同,类的静态构造函数是于创立第一独实例或引用任何静态成员之前自动调用的,而构造的静态构造函数在以下状况调用:

  1、使用显式声明的构造函数进行初始化

  2、调用结构的计还是看结构的静态多少成员(无论是读取还是赋值,访问实例数据成员不会见触发CLR自动调用静态的构造函数)。

五、结构的多态和可继承性

  结构一直派生自System.ValueType,间接派生自System.Object,但布局是隐式密封的,不可知同日而语基类在派生出其他的构造,也无可知从类派生,但好打接口派生。

  结构的表征:

  1、结构类型总是隐式密封的,因此在概念结构时未可知用sealed和abstract关键字;

  2、因为组织不能够当基类,结构的分子不可知应用如下访问修饰符:protected和protected,internal;

  3、结构的函数成员不可知宣称也abstract和virtual,但是足以应用override关键字,用以覆写它的基类System.ValueType中之道。

六、结构的装箱与拆箱

  结构是值类型,因此当其为转移为object类型时,或者它所实现之接口类型的时段,就会执行装箱操作;同样,当尽反操作的早晚,就见面实行拆箱操作。

七、结构和接近的相比

                       结构
                   类
  数据类型                值类型                  引用类型
  是否要采用new运算符实例化      否                    是
  是否只是声明无参数的构造函数       否                    是
  数据成员是否在宣称的又初始化     声明也const或static可以,数据成员不得以 
可以
  直接派生自什么品种           System.ValueType           
 有
  是否来析构函数             无                    有
  可否从类派生              否                    可以
  可否实现接口              可以                   可以
  实例化时于库还是当积分配内存      栈                    堆,栈中保存引用
  该品种的变量可否被赋值为null      
否                    可以
  可否定义私有的无参构造函数       否                    可以
  是否总起一个默认的无参构造函数      
是                    否

  无论结构使预定义的、无参数的构造函数,还是采取用户定义的、有参数的构造函数进行初始化,都见面初始化结构的数据成员。不过预定义的,无参的会将数值型初始化为默认值,引用类型初始化为null;而用户从定义的初始化策略对只分子开展初始化。因此结构类型的数据成员不允许在声明是显式初始化。

八、性能

  因为结构是值类型,因此在啊组织分配内存,或者当组织超出了作用域被删去时,性能会很好,因为他俩将内联或者保存在堆栈中。当把一个构造类型的变量赋值给任何一个布局时,对性能的震慑在结构的轻重缓急,如果组织的数据成员好多而且复杂,就会见招损失,接下去使用相同段子代码来证明这题目。

  结构及类似的适用场合分析:

  1、当堆栈的空间大简单,且发生大量的逻辑对象时,创建类设较创布局好有的;

  2、对于触发、矩形和颜料这样的轻量对象,假如要声明一个涵盖许多个颜色对象的再三组,则CLR需要为每个对象分配内存,在这种状态下,使用结构的本钱较逊色;

  3、在呈现抽象和多级别的目标层次常常,类是最好好的选料,因为组织不支持继承。

  4、大多数景下,目标项目只是含有一些多少,或者坐数据为主。