类与结构的区别
类(class)与结构(struct)都是创建对象的模版,每个对象都包含数据,并提供了处理和访问数据的方法。类与结构的区别是它们在内存中的存储方式、访问方式和一些特性的不同,它们主要区别在于:
- 类是引用类型,结构是值类型。类的存储是在堆(heap)上,而结构的存储是在堆栈(stack)中或存储为内联(inline),存储为内联是因为如果它们是另一个保存在堆栈中的对象的一部分。结构其生存期的限制与简单的数据类型一样。
- 类支持继承,结构不支持类继承。
- 使用结构,可以指定字段如何在内存中布局。
类的存储是在堆上,通过这种方式可以在数据的生存期上获得很大的灵活性,但性能会有一定损失,通过托管堆的优化,这种性能损失很小。在大多情况下,类比结构常用的多,但有时仅需要一个小的数据类型,此时,类提供的功能多余我们需要的功能,何必损失性能,此时最好使用结构。结构与类在语法上都很相似,主要区别在于使用的声明关键字(class和struct)。
类的声明:
public class Demo
{
private int ID;
private string Name;
public const string Day="Monday";
public Demo(int ID,string Name)
{
this.ID=ID;
this.Name=Name;
}
}
结构的声明:
struct DemoStruct
{
private int ID;
private string Name;
Demo(int id,string name)
{
ID=id;
Name=name;
}
}
对于类和结构都是使用new关键字来声明实例的。
Demo demo=new Demo();
DemoStruct demostruct=new DemoStruct();
上面我们说到,结构是值类型,但在语法上我们把它当做类来处理。
DemoStruct demostruct=new DemoStruct();
demostruct.ID=1;
但因为结构是值类型,所以new运算符与类的其它引用类型工作方式不同,new运算符并不分配堆中的内存,而是调用相应的构造函数,根据传递给它的参数,初始化所有的字段。所以可改写为:
DemoStruct demostruct;
demostruct.ID=1;
如果上面是一个类就会报错,demostruct包含一个未初始化的引用(不指向任何地方的一个地址),所以不能给其字段赋值,对于结构,变量声明实际上是为整个结构分配堆栈中的空间,这样就可以赋值了。
好了,结构与类就说到这吧。