https://blog.csdn.net/u014732824/article/details/84325194
C#中對於struct我們進行初始化時可以使用new 語句
例如有一個結構體Point
struct Point
{
float x;
float y;
}
我們將其實例化時可以使用語句:
Point p = new Point();
這不同於類使用new 語句,我們知道對一個類使用new語句會在託管堆上分配空間,而struct是值類型所以應該在棧上爲其分配空間。
實際上,以上語句的功能與
Point P; 功能基本相同,不同的是使用new 語句,C#會認爲接口體中的成員已經得到初始化,此時x,y會被初始化爲默認值0.
如果不使用new 語句,x,y的值可能未知。
看一個例子:
Point p = new Point();
float a = p.x; ///////////編譯通過,a的值爲0
Point p;
foalt a = p.x; ////////////編譯不過,編譯器認爲p的字段未得到初始化
聲明結構的默認(無參數)構造函數是錯誤的。總是提供默認構造函數以將結構成員初始化爲它們的默認值。在結構中初始化實例字段也是錯誤的。 如果使用 new 運算符創建結構對象,則會創建該結構對象,並調用適當的構造函數。與類不同,結構的實例化可以不使用 new 運算符。如果不使用 new,則在初始化所有字段之前,字段都保持未賦值狀態且對象不可用。 結構類型使用new不會分配託管堆分配內存而是調用構造函數初始化字段。結構的構造函數要麼是有參數的,不可能是無參數,應爲無參數是系統自己隱式添加的,就算有另外的構造函數,如果你顯示的聲明一個無參數的構造函數在結構裏,將導致編譯錯誤。 結構體如果不用new初始化,也可以,但是在其使用前必須手動初始化他的每一個成員,否則編譯器將報錯。用new初始化,可自動將其中的每一個成員都置爲零值