Struct简介:
结构是使用 struct 关键字定义的,与类相似,都表示可以包含数据成员和函数成员的数据结构。
1.结构是一种值类型,并且不需要堆分配。 它都放在堆栈上
2.结构的实例化可以不使用 new 运算符。类必须用new初始化,否则会爆仓哦
3.在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
4.结构类型永远不是抽象的,并且始终是隐式密封的,因此在结构声明中不允许使用abstract和sealed修饰符。
5.结构不能声明默认构造函数(没有参数的构造函数)或析构函数,但可以声明带参数的构造函数。
6.结构可以实现接口,但不能从另一个结构或类继承,而且不能作为一个类的基类,所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
7.结构在赋值时进行复制。 将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。 在使用值类型的集合(如 Dictionary<string, myStruct>)时,请务必记住这一点。
8.结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应数据的一个引用(被引用的数据称为“对象”)。但是结构仍可以通过ref和out参数引用方式传递给函数成员。
9.结构可用作可以为 null 的类型,因而可向其赋 null 值。
注意:因为结构一般用的比较少,所以也就不用深究,了解其大概功能即可;
下面通过一个例子,来说明结构的用法以及他和类的区别:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Struct { class Program { static void Main(string[] args) { Console.WriteLine("-----------------Struct Test------------------"); structPerson sp1 = new structPerson(12, "nomei"); Console.WriteLine("old sp1:" + sp1.ToString()); structPerson sp2; sp2 = sp1; sp1.age = 100; sp1.name = "hihi"; Console.WriteLine("sp1 changed:" + sp1.ToString()); Console.WriteLine("sp2:" + sp2.ToString()); Console.WriteLine("-----------------Class Test------------------"); //classPerson cp1; //cp1.name = "nihao"; //会提示错误,使用为赋值的变量。这时只是声明了类型的对象,并未实例化,也就是说在堆栈上只 有对象的引用,在堆上没有具体的对象 classPerson cp1 = new classPerson(23, "nice to meet you"); Console.WriteLine("old cp1:"+cp1.ToString()); classPerson cp2 = cp1; cp1.name = "i don not know"; Console.WriteLine("change cp1:"+cp2.ToString()); Console.WriteLine("cp2:"+cp2.ToString()); Console.ReadKey(); } } struct structPerson { public int age; //一般变量是不能赋初值 public string name; public static string information = "nimei"; //静态变量可以赋初值 // public structPerson() { } //不能包含无参数的构造函数 public structPerson(int age, string name) //可以实现有参数的构造函数 { this.age = age; this.name = name; } public override string ToString() //重写tostring()方法 { return "name=" + name + "," + "age=" + age; } } class classPerson { public int age; public string name; public string information = "jsf"; //一般变量可以赋值,不同于struct public classPerson() { } //可以拥有自己的无惨构造函数 public classPerson(int age, string name) { this.age = age; this.name = name; } public override string ToString() { return "age=" + age + ",name" + name; } } }
-----------------Struct Test------------------
old sp1:name=nomei,age=12
sp1 changed:name=hihi,age=100
sp2:name=nomei,age=12
-----------------Class Test------------------
old cp1:age=23,namenice to meet you
change cp1:age=23,namei don not know
cp2:age=23,namei don not know
从执行结果可以发现:
对于结构,因为其在堆栈上是一种值类型,所以不用初始化,复制的时候也是复制一个对象的副本
而对于类,他是在堆栈中存放他的对象的引用,而在堆中存放他的对象,所以用的时候必须对他进行初始化。复制的时候也只是复制对象的引用而已