【知識積累】C#中結構體和類的區別
【類】
類是對現實生活中一類具有共同特徵的事物的抽象。類的實質是一種資料型別,類似於int、char等基本型別,不同的是它是一種複雜的資料型別。因為它的本質是型別,而不是資料,所以不存在於記憶體中,不能被直接操作,只有被例項化為物件時,才會變得可操作。
類的內部封裝了方法,用於操作自身的成員。類是對某種物件的定義,具有行為。它描述一個物件能夠做什麼以及做的方法。它們是可以對這個物件進行操作的程式的過程。包含有關物件動作方式的資訊,包括它的名稱、方法、屬性、事件。
類的構成包括資料成員和成員函式。資料成員對應類的屬性,類的資料成員也是一種資料型別,並不需要分配記憶體。成員函式則用於操作類的各項屬性,是一個類具有的特有的操作。類和外界發生互動的操作稱為介面。
類的定義:
<pre name="code" class="html">class 類名 { public: 公有成員 private: 私有成員 protected: 保護成員 };
類的例項化:Dog dog=new Dog();
【結構體】
結構是使用struct關鍵字定義的,與類類似,都表示可以包含資料成員和函式成員的資料結構。
結構的特徵:
結構的例項可以不使用new運算子;在結構宣告中,除非欄位被宣告為const或static,否則無法初始化。
結構可以實現介面,但是不能從另一個結構或類繼承,而且不能作為一個類的基類。
結構的定義:
struct A
{
public int X;
}
二者區別:
1、語法定義不同:
定義類,使用關鍵字class;定義結構使用關鍵字struct。
在結構體重可以宣告欄位,但是宣告欄位的時候不可以給其賦初始值。類卻沒問題。
總體上來說,從語法上看,它們的語法都是大同小異,類裡面的成員幾乎都可以定義在結構體中(解構函式除外。)
2、關於建構函式:
在類裡面,對於隱式的建構函式,如果我們沒有為類寫任何建構函式,那麼C#編譯器就會自動生成一個不帶參的隱式建構函式,一旦這個類裡面寫了任何建構函式,這個隱式建構函式就會不再自動生成。
在結構中,也存在一個隱式的建構函式,並且不可以在這個類中再手動為結構新增一個無參的建構函式。同時,結構體中的所有欄位必須要被賦值。
3、代表型別:
類是引用型別,引用型別的變數中儲存的物件是堆空間中的地址,(空間大,速度慢)
結構體是值型別,當其作為一個區域性變數的時候,變數是儲存在棧空間中的。(空間小,速度快)
4、適用場景:
struct型別適合表示如點、矩形和顏色這樣的輕量級物件。同時,我們在變數傳值的時候,希望傳遞物件的拷貝而不是物件的引用地址,這個時候需要適用結構。
類主要是用來表示包含多個屬性等的重量級物件。可以包含資料成員和函式成員的資料結構。