目录
结构体和类的最大区别是在存储空间上,前者是值类型,存储在栈上,后者是引用类型,存储在堆上,它们在赋值上有很大的区别,在类中指向同一块空间的两个类的值会随一个类的改变而改变另一个,请看如下代码所示:
- namespace test1
- {
- //结构体A
- struct A
- {
- public int a;
- public A(int a=0)
- {
- this.a=a;
- }
- }
- //类B
- class B
- {
- public int b;
- public B(int b = 0)
- {
- this.b = b;
- }
- }
- internal class Program
- {
- static void Main(string[] args)
- {
- A a1 = new A(100);
- A a2 = a1;
- B b1=new B(100);
- B b2 = b1;
- Console.WriteLine("结构体A");
- Console.WriteLine("a1.a:{0}",a1.a);
- Console.WriteLine("a2.a:{0}", a2.a);
- Console.WriteLine("类B");
- Console.WriteLine("b1.b:{0}", b1.b);
- Console.WriteLine("b2.b:{0}", b2.b);
- a2.a = 200;
- b2.b = 200;
- Console.WriteLine("修改后");
- Console.WriteLine("结构体A");
- Console.WriteLine("a1.a:{0}", a1.a);
- Console.WriteLine("a2.a:{0}", a2.a);
- Console.WriteLine("类B");
- Console.WriteLine("b1.b:{0}", b1.b);
- Console.WriteLine("b2.b:{0}", b2.b);
- }
- }
- }
运行结果如上图,我们发现修改结构体a2不会改变a1的内容,而修改类b2则会让b1的内容跟着修改,这是因为类是存在堆上的,将b2=b1时,这两个类对象同时指向堆上的同一块空间,这时改变任何一方都会引起另一方的改变。
此外,结构体和类在使用上很类似,结构体甚至可以用面向对象的思想来形容一类对象。
结构体具备着面向对象思想中封装的特性,但是它不具备继承和多态的特性,因此大大减少了它的使用频率。
结构体不具备继承特性,因此不能使用protected保护访问修饰符
1.结构体是值类型,类是引用类型
2.结构体存在栈中,类存在堆中
3.结构体成员不能使用protected访问修饰符,而类可以
4.结构体成员变量申明不能指定初始值,而类可以
5.结构体不能申明无参的构造函数,而类可以
6.结构体申明有参构造函数后,无参构造不会被顶掉
7.结构体不能申明析构函数,而类可以
8.结构体不能被继承,而类可以
9.结构体需要在构造函数中初始化所有成员变量,而类随意
10.结构体不能被静态static修饰(不存在静态结构体),而类可以
11.结构体不能在自己内部申明和自已一样的结构体变量,而类可以
结构体可以继承接口,接口是行为的抽象
1.想要用继承和多态时,直接淘汰结构体,比如玩家、怪物等等
2.对象时数据集合时,优先考虑结构体,比如位置、坐标等等
3.从值类型和引用类型赋值时的区别上去考虑,比如经常被赋值传递的对象,并且改变赋值对象,原对象不想跟着变化时,就用结构体。比如坐标、向量.旋转等等