类和结构有什么区别?二者什么情况下使用?
在学习结构的时候,发现结构和类有很多相似之处,比如:都是使用new关键字来实例化、都有成员变量、成员方法和属性。但是他们肯定是不一样的两个东西,所以查阅的大量的资料将这个知识点总结出来,让更多的读者都能受益匪浅。
相同之处:
1、都有成员变量、成员方法、构造函数
2、类中的成员结构都可以定义(除析构函数外)
不同之处:
1、声明时的关键字不同,结构是 struct ,而类是 class
2、结构是值类型,存储在栈中,类是引用类型,存储在托管堆中,结构在声明的时候就已经为其分配栈上的内存了,而类需要用new为其分配堆上的内存。
3、结构是隐式密封的,不能使用 sealed (只能在当前项目中访问,不能继承只能实例化) 和 abstract (只能在当前项目中访问,不能实例化只能继承) 修饰符,结构体不能被继承,所以在调用结构方法时不需要查找 vtable 虚函数继承表,类可以被继承。
4、结构中的实例字段只能声明不能赋值,而类没有限制。结构只声明没有用 new 进行初始化时,可以给它的实例字段直接赋值,而类不行。
5、结构没有析构函数,结构中的方法不能用 virtual 和 abstract 修饰符,但是可以用 override 修饰,用来重写父类的方法。
6、结构不能显示给出默认构造函数(无参构造函数),无论有没有自定义构造,默认构造都隐式存在,而类中有自定义的构造函数时,默认构造会被隐藏,想要调用默认构造,必须显示给出默认构造。
7、结构可以使用属性,但是属性和构造函数不能同时存在。
8、结构的自定义构造函数必须初始化所有的实例字段和没有初始化的非静态属性,类没有限制。
结构和类的使用场景:
结构的使用场景:
1、结构是值类型在栈中,栈的存取速度比堆快,但是容量小,适合轻量级的对象,比如点、矩形、颜色
2、如果需要描述少量字段,不需要继承,就用结构
3、在变量传值的时候,希望传递对象的是拷贝,而不是对象的引用地址,这个时候就可以使用结构
类的使用场景:
1、类是引用类型,存储在托管堆中,托管堆的容量大,适合重量级的对象
2、如果需要描述大量字段,又比较抽象,需要继承,就用类
以上是个人在学习c#结构中的一些知识点的总结,有些地方难免会有一些瑕疵,还是希望各位IT大佬能够指出我的错误,欢迎大家的指正,谢谢!