==========================================================================
结构是使用 struct 关键字定义的,例如:C#
public struct PostalAddress { //Fields, properties, methods and events go here... }
结构与类共享大多数相同的语法,但结构比类受到的限制更多:
1.在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
2.结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
3.结构可以声明带参数的构造函数。
4.结构不能从类或其他结构继承。
5.结构在赋值时进行复制。将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。
6.结构是值类型,而类是引用类型。
7.与类不同,结构的实例化可以不使用 new 运算符。
8.一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自System.ValueType,后者继承自 System.Object。
9.结构可以实现接口。
===============================================================
类和结构是 .NETFramework 中的通用类型系统的两种基本构造。两者在本质上都属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为。数据和行为是该类或结构的“成员”,它们包含各自的方法、属性和事件等(本主题后面列出了这些内容)。
类或结构的声明类似于蓝图,用于在运行时创建实例或对象。如果定义一个名为Person的类或结构,则 Person为类型名称。如果声明并初始化 Person类型的变量 p,则 p 称为Person的对象或实例。可以创建同一 Person类型的多个实例,每个实例在其属性和字段中具有不同的值。
类是一种引用类型。创建类的对象时,对象赋值到的变量只保存对该内存的引用。将对象引用赋给新变量时,新变量引用的是原始对象。通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。
结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。
类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。
值类型:
基本数据类型 + 枚举、结构
引用类型:
类、接口、委托、string、数组
=============================结构、类的相同点与不同点===========================================================
类的优点在于它可以作为引用类型:与将结构变量与它的所有数据一起传递相比,传递引用更有效。但是,结构不要求在全局堆中分配内存。
因为不能从结构继承,结构只应当用于不需要扩展的对象。当希望创建的对象实例较小时使用结构,并要考虑类与结构之间性能特点的对比。
相同点
结构和类在以下方面相同:
1.两者都属于“容器”类型,这意味着它们包含其他以成员形式存在的类型。
2.两者都具有成员,成员可以包括构造函数、方法、属性、字段、常数、枚举、事件和事件处理程序。但是,不要将这些成员与结构的声明“元素”混淆。
3.两者的成员可以分别有不同的访问级别。例如,一个成员可以声明为Public,而另一个可以声明为 Private。
4.都可实现接口。
5.都有共享的构造函数,有或没有参数。
6.两者都可以公开“默认属性”,前提是该属性至少带有一个参数。
7.两者都可以声明和引发事件,而且两者都可以声明委托。
不同点
1.结构和类在以下方面有所不同:
2.结构是“值类型”,而类是“引用类型”。结构类型的变量包含此结构的数据,而不是像类类型那样包含对数据的引用。
3.结构使用堆栈分配,类使用堆分配。
4.所有的结构元素都默认为Public;类变量和常数默认为 Private,而其他的类成员默认为 Public。类成员的这一行为提供与 VisualBasic 6.0 默认值系统的兼容。
5.结构必须至少具有一个非共享变量或非共享的非自定义事件元素;而类可以完全是空的。
6.结构元素不可声明为Protected;类成员可以。
7.只有 Shared(Visual Basic)Sub结构过程才能处理事件,并且只能使用 AddHandler语句语句;而任何类过程都可以处理事件,并且可以使用Handles 关键字或AddHandler 语句。有关更多信息,请参见事件和事件处理程序。
8.结构变量声明不能指定初始值设定项或数组初始大小,而类变量声明可以。
9.结构从System..::.ValueType 类隐式继承,不能从任何其他类型继承;而类可以从 System..::.ValueType 以外的其他任何类继承。
10.结构是不可继承的;而类可以继承。
11.结构从不终止,所以公共语言运行库(CLR)从不对任何结构调用 Finalize方法;而类可由垃圾回收器 (GC) 终止,当检测到没有剩余的活动引用时,垃圾回收器将对类调用 Finalize。
12.结构不需要构造函数;而类需要。
13.结构仅当没有参数时可以有非共享的构造函数;类无论有没有参数都可以。
14.每一个结构都有不带参数的隐式公共构造函数。这个构造函数将结构的所有数据元素都初始化为默认值。不能重定义此行为。
一个具体简单的示例:
新建控制台应用程序,源码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _05结构
{
class Program
{
//在没有面向对象、在没有类的情况下如何组织一些相关的数据?
//一种值类型,不具有面向对象的特征,通常用来封装小型相关变结构体是一个值类型。(非常像类的量组 )
//System.Drawing.Point、Size、Color,可以再winform中查看
static void Main(string[] args)
{
//结构与类的最大区别是:
//结构是值类型,类是引用类型
//结构不能继承,但可以实现接口。
Student s = new Student();
s.Email = "ddddd";
s.name = "ddd";
s.age = 10;
s.SayHi();
s.Flay();
Console.WriteLine(s.Email);
Console.ReadKey();
}
}
//如果需要面向对象的特征,如果存储的数据量比较大则使用类
//如果存储的数据量比较小,不需要面向对象特性则使用结构。
struct Student : IFlayble
{
public string name;
public int age;
public string Email
{
get;
set;
}
public void SayHi()
{
Console.WriteLine("Hi.....");
}
public void Flay()
{
Console.WriteLine("飞.....");
}
}
public interface IFlayble
{
void Flay();
}
}
输出结果如下: