过去主要使用VC++, 除了默认的成员修饰符等细微差别外,VC++中的结构和类相似度很高。
现在在转像C#,结构和类的差别就大了:
1、结构是值类型, 在堆栈上分配地址, 类是引用类型, 在堆上分配地址。
2、 结构:不能从另外一个结构或者类继承,本身也不能被继承;类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承。
3、结构: 没有默认的构造函数,但是可以添加构造函数,没有析构函数。类: 有默认的构造函数,有析构函数。
关于值类型和引用类型的不同,以下代码片段可以完全体现出来:
struct PersonStruct
{
private string name;
/// <summary>
/// Geter/Seter to name
/// </summary>
public String Name
{
set
{
this.name = value;
}
}
}
class PersonClass
{
private string name;
/// <summary>
/// Geter/Seter to name
/// </summary>
public String Name
{
set
{
this.name = value;
}
}
}
public static void Main()
{
PersonStruct[] persons1 = new PersonStruct[2] { new PersonStruct("a"), new PersonStruct("b") }; //新建一个2长度的PersonStruct数组
PersonStruct[] persons2 = (PersonStruct[])persons1 .Clone();//对第一个数组浅拷贝
persons2 [0].Name = "c"; //把被拷贝的结构数组的第一个元素的Name属性修改为'c'
Console.WriteLine(persons1[0].Name); //将输出 'a'
PersonClass[] personc1 = new PersonClass[2] { new PersonClass("a"), new PersonClass("b") }; //新建一个2长度的PersonClass数组
PersonClass[] personc2 = (PersonClass[])personc1 .Clone();//对第一个数组浅拷贝
personc2 [0].Name = "c"; //把被拷贝的类型数组的第一个元素的Name属性修改为'c'
Console.WriteLine(personc1[0].Name); //将输出 'c'
}
从上面例子可见,对于值类型的数据进行浅拷贝,实际相当于创建了一段新的内存区域,这有点类似与C+中的深拷贝概念。拷贝和被拷贝的数据之间是不相关联的。修改拷贝的新对象的属性,并不会影响被拷贝的原始对象的属性。
而对于引用类型的数据类型而言,浅拷贝并不创建新的对象,而是只是建立了一个新的引用,也就是说,personc1中的元素实际上和personc2中的元素指向同样的内存区域,所以修改了 personc2[0]的属性也就同时修改了personc1[0]的属性了。