New的調(diào)用
在C++中,new關(guān)健字可以在堆上生成一個對象。在C#中卻不是這樣。對于引用類型變量而言,new關(guān)健字在堆上生成一個對象;對于結(jié)構(gòu)等值類型變量而言,new關(guān)健字在棧中生成一個對象,并需要調(diào)用constructor。
事實上,我們可以不使用new關(guān)健字而在棧上生成一個結(jié)構(gòu)類型的變量,但這時需要注意的是,New關(guān)健字能夠初始化對象。如果不使用new,則在使用前必須手工地對結(jié)構(gòu)中的所有成員進(jìn)行初始化,否則在編譯時會出錯。
對象的初始化
usingSystem;//有二個成員變量和一個構(gòu)造器的簡單結(jié)構(gòu)
publicstructPoint
{
publicPoint(intx,inty)
{
this.x=x;
this.y=y;
}
publicintx;
publicinty;
}
publicclassTester
{
publicstaticvoidMain()
{
Testert=newTester();
t.Run();
}
publicvoidRun()
{
Pointp1=newPoint(5,12);
SomeMethod(p1);//fine
Pointp2;//不調(diào)用new而直接創(chuàng)建
//編譯器編譯到這里時會出錯,因為p2的成員變量沒有被初始化
//SomeMethod(p2);
//手工對它們進(jìn)行初始化
p2.x=1;
p2.y=2;
SomeMethod(p2);
}
在C++中,new關(guān)健字可以在堆上生成一個對象。在C#中卻不是這樣。對于引用類型變量而言,new關(guān)健字在堆上生成一個對象;對于結(jié)構(gòu)等值類型變量而言,new關(guān)健字在棧中生成一個對象,并需要調(diào)用constructor。
事實上,我們可以不使用new關(guān)健字而在棧上生成一個結(jié)構(gòu)類型的變量,但這時需要注意的是,New關(guān)健字能夠初始化對象。如果不使用new,則在使用前必須手工地對結(jié)構(gòu)中的所有成員進(jìn)行初始化,否則在編譯時會出錯。
對象的初始化
usingSystem;//有二個成員變量和一個構(gòu)造器的簡單結(jié)構(gòu)
publicstructPoint
{
publicPoint(intx,inty)
{
this.x=x;
this.y=y;
}
publicintx;
publicinty;
}
publicclassTester
{
publicstaticvoidMain()
{
Testert=newTester();
t.Run();
}
publicvoidRun()
{
Pointp1=newPoint(5,12);
SomeMethod(p1);//fine
Pointp2;//不調(diào)用new而直接創(chuàng)建
//編譯器編譯到這里時會出錯,因為p2的成員變量沒有被初始化
//SomeMethod(p2);
//手工對它們進(jìn)行初始化
p2.x=1;
p2.y=2;
SomeMethod(p2);
}