参考:https://blog.csdn.net/qiaoquan3/article/details/51234208
1、struct 是值类型,创建一个struct类型的实例被分配在栈上。struct 实例的赋值,赋的值是值;struct作为参数类型传递,传递的是值。
class 是引用类型,创建一个class类型实例被分配到托管堆上。class 实例的赋值,赋的是引用地址;class 作为参数类型传递,传递的是引用地址。
2、struct 默认的访问权限是public,而class 默认的访问权限是private
3、struct不能显式地声明无参数构造函数(默认构造函数)或析构函数,也就是struct声明的构造函数必须带有参数;而class 可以显式声明无参数构造函数来实现默认构造函数。
4、如果class 中只声明了一个有参数的构造函数,则用new关键字创建实例时不能用无参构造函数,否则会出现‘XXX不包含0个参数的构造函数’的编译错误,表明class 中除非没有一个构造函数,否则声明了什么构造函数,就只能用什么构造函数。而struct中由于只能声明带参数的构造函数,当创建实例时 class 创建实例必须用new关键字,而struct可以用new,也可以不用new,区别在于new生成的struct中,struct的成员函数是有初始值的。
eg:
struct Point
{
float x;
float y;
}
Point p = new Point();p是值类型所以应该在栈上为其分配空间
float a = p.x; //编译通过,使用new 语句,C#结构体中的成员已经得到初始化,a的值为0
Point p;
foalt a = p.x; //编译不过,编译器认为p的字段未得到初始化,是未知的
5、class支持继承,struct不支持继承,但支持接口。
6、class偏向于“面向对象”,用户复杂,大型数据,而struct偏向于‘简单值’,比如小于16字节,结构简单
7、class 的成员变量可以在声明的时候赋初始值,而在struct声明中,除非字段被声明为const或static,否则无法初始化。
何时使用struct,何时使用class
在多数情况下。推荐使用class,因为无论是类的赋值,作为参数类型传递,还是返回类的实例,实际copy的是托管堆上引用地址,也就大概4个字节,这非常有助于性能的提升。
而作为struct类型,无论是赋值,作为参数类型传递,还是返回struct类型实例,是完全copy,会占用栈上的空间。
根据Microsoft's value type recommendation,在如下情况下,推荐使用struct:
1)小于16字节
2)偏向于值,是简单数据,而不是偏向于‘面向对象’
3)希望值不可变