1.區別概述
結構體和類的最大區別是在存儲空間上,前者是值類型,后者是引用類型,它們在賦值上有很大的區別,在類中指向同一塊空間的兩個類的值會隨一個類的改變而改變另一個,請看如下代碼所示:
namespace test1
{//結構體Astruct A{public int a;public A(int a=0){this.a=a;}}//類Bclass 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保護訪問修飾符
2.細節區別
1.結構體是值類型,類是引用類型
2.結構體存在棧中,類存在堆中
3.結構體成員不能使用protected訪問修飾符,而類可以
4.結構體成員變量申明不能指定初始值,而類可以
5.結構體不能申明無參的構造函數,而類可以
6.結構體申明有參構造函數后,無參構造不會被頂掉
7.結構體不能申明析構函數,而類可以
8.結構體不能被繼承,而類可以
9.結構體需要在構造函數中初始化所有成員變量,而類隨意
10.結構體不能被靜態static修飾(不存在靜態結構體),而類可以
11.結構體不能在自己內部申明和自已一樣的結構體變量,而類可以
?
3.結構體的特別之處
結構體可以繼承接口,接口是行為的抽象
4.如何選擇結構體和類
1.想要用繼承和多態時,直接淘汰結構體,比如玩家、怪物等等
2.對象時數據集合時,優先考慮結構體,比如位置、坐標等等
3.從值類型和引用類型賦值時的區別上去考慮,比如經常被賦值傳遞的對象,并且改變賦值對象,原對象不想跟著變化時,就用結構體。比如坐標、向量.旋轉等等
?