關於值型別的例項建構函式有如下的一些規則:
1、值型別不能有無引數的例項建構函式,將發生編譯錯誤,例如下面的**將發生「error 1 structs cannot contain explicit parameterless constructors 」的編譯錯誤。
struct teststruct
} 2、值型別可以有含引數的建構函式。且可以用new來呼叫它。
1)如果值型別物件作為區域性變數,則值型別物件必然要分配在棧上,此時,對於如下兩種構造將有如下的區別:
teststruct teststruct = new teststruct();
teststruct teststruct;
根據前面所述原則,兩者的區別在於第一種構造為teststruct進行了初始化,而第二種構造方法沒有對teststruct物件進行初始化。因此,對於第二種構造下面的**會產生「error 1 use of possibly unassigned field 'x' 」的編譯錯誤,即沒進行初始化。
teststruct teststruct;
int p = teststruct.x;
teststruct teststruct;
teststruct.x = 10;
int p = teststruct.x;
而對於第一種構造方式,由於呼叫new即完成了初始化,大大提高了程式設計效率,因此比較廣泛的使用。
2)如果值型別物件作為類成員,此時值型別物件將作為引用型別物件的成員分配到棧上,分配到棧上的字段會自動被初始化為0,因此對於下面兩種構造方式沒有太大的區別。
public class testclass
而且對於下面的**也能順利執行:
public class testclass
} 總結以上所述:1、值型別呼叫new構造僅僅是為了初始化記憶體,2、值型別物件作為區域性變數和引用型別欄位的表現不同,本質原因在於,clr將自動為在堆上分配的記憶體初始化,而在棧上分配的記憶體不自動初始化。3、new是構造值型別物件的通用方法,但不是唯一方法,用這種方法構造可以提高效率,避免一些細小的問題。
C 值型別建構函式注意事項
c 語言相比其他支援clr的語言來說,對於值型別的構造有個特殊的地方,即不允許值型別有無引數的建構函式 所以當乙個值型別沒有提供任何建構函式的時候,是不能夠對字段在定義中進行初始化,如下 public struct point 因為對於成員變數申明的同時進行初始化,編譯器會在建構函式中將初始化的 加...
例項構造器與型別構造器
例項構造器即例項建構函式,型別構造器也就是靜態建構函式.1 在例項構造器裡面,我們可以初始化類的例項欄位和靜態欄位.class test 2 在型別構造器裡面我們只能初始化靜態字段,其目的也在於此.class test 3 例項構造器和型別構造器觸發的條件不一樣.例項構造器是在乙個類的例項構造的時候...
建構函式 例項解析
class person public string name public ganderenum gander public int weight public person ganderenum g int weight 建構函式,沒有返回值 public person ganderenum g...