C# 结构体

C# 结构体
  结构(struct,structure的简写)。结构就是由几个数据组成的数据结构,这些数据可能有不同的类型。根据这个结构,可以定义自己的变量类型。结构体与类特别的相似。
 
定义结构体的语法
  和类一样,定义在命名空间下面。结构体中可以定义字段、还可以定义方法、属性、构造函数。结构使用struct关键字来定义,如下所示:
      struct 结构体的名字
      {
           
       }
 
结构体与类的区别
1、从语法上的区别
  • 类使用class关键字声明,结构体使用struct关键字声明
  • 可以为结构体声明字段,但是在声明字段的同时不能为其赋默认值。
  • 属性与类中的属性一样,用来保护字段的,这个和类中的属性没有区别。
  • 方法同样的表示一个功能,与类中的方法没有任何区别。
  • 无参数的构造函数无论如何都会被C#编译器自动生成,所以不允许程序员为结构体写一个无参数的构造函数。
  • 要求在结构体的构造函数中,必须要为当前结构体对象的每一个字段赋值。
 
2、创建对象
  • 在创建结构体对象的时候,可以像类那样使用new关键字来创建。也可以不使用new关键字来创建。
  • 通过new关键字创建对象以后,这个对象的每一个字段就已经有值了。那么我们就可以直接的使用。
  • 因为通过new关键字创建对象,调用了构造函数。而在构造函数中又必须要为每一个字段赋值。我们可以猜出,无参数的构造函数中做的事情:为值类型的字段赋值0,为引用类型的字段赋值null。
  • 如果不使用new关键字来创建对象,那么这个结构体对象的字段是没有值的,要求在使用字段的值之前,必须为这些字段赋值。因为这种方式创建结构体对象,没有调用构造函数,而在声明字段的时候又不允许赋值。所以这样创建对象字段是没有值的。
 
结构体与类本质上的区别
  • 结构体是一个值类型,类是引用类型。
  • 结构体的变量本身就是一个对象,其中不像类那样存储地址。真正的结构体对象直接存储在这个结构体的变量中。结构体对象的成员直接存储在结构体变量中。在声明结构体变量的时候,其实就已经在结构体变量中创建好对象。new关键字仅仅调用构造函数。
  • 结构体相互赋值的时候,是逐个拷贝字段的值。
 
结构体与类的详细区别
结构与类共享大多数相同的语法,但结构比类受到的限制更多:
  1、在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
  2、结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
  3、结构可以声明带参数的构造函数。
  4、结构不能从类或其他结构继承。
  5、结构在赋值时进行复制。将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。
  6、结构是值类型,而类是引用类型。
  6、与类不同,结构的实例化可以不使用 new 运算符。
  7、一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
结构可以实现接口。
 
===============================================================
类和结构是 .NET Framework 中的通用类型系统的两种基本构造。两者在本质上都属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为。数据和行为是该类或结构的“成员”,它们包含各自的方法、属性和事件等。
 
类或结构的声明类似于蓝图,用于在运行时创建实例或对象。如果定义一个名为 Person 的类或结构,则 Person 为类型名称。如果声明并初始化 Person 类型的变量 p,则 p 称为 Person 的对象或实例。可以创建同一 Person 类型的多个实例,每个实例在其属性和字段中具有不同的值。
类是一种引用类型。创建类的对象时,对象赋值到的变量只保存对该内存的引用。将对象引用赋给新变量时,新变量引用的是原始对象。通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。
 
结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。
 
类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。
 
什么时候使用结构体呢?
  • 栈空间比较小,但是访问速度较快。堆空间比较大,但是访问速度较慢。
  • 结构体对象是分配在栈空间的,所以结构体对象的访问速度比堆空间中的类的对象要快。
  • 当我们要表示一个轻量级对象的时候,其中的成员较少。就可以将其声明为结构体。这个时候访问速度较快。重量级对象当成员比较多的时候,就声明为类,让对象分配在堆空间中。
 

 

posted @ 2015-08-08 18:10  Chen_Weifeng  阅读(897)  评论(0编辑  收藏  举报