C#中new操作符的工作機(jī)制
使用new操作符來創(chuàng)建對象,其背后到底發(fā)生了什么?
有一個父類Animal,Dog派生于Animal。
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Console.WriteLine("我能調(diào)用老祖宗Object的實例方法GetType,顯示結(jié)果為:" + dog.GetType() );
Console.WriteLine("我能拿到父類的屬性Age=" + dog.Age);
Console.WriteLine("我當(dāng)然能拿到自己的公共字段_weight=" + dog._weight);
}
}
public class Animal
{
public int Age { get; set; }
public Animal(){}
}
public class Dog : Animal
{
public decimal _weight;
public Dog(){}
}
雖然創(chuàng)建了子類Dog的實例,但通過dog實例能調(diào)用"老祖宗"System.Object的實例方法,也能獲取到父類的公共屬性Age的值,并且所有的實例字段值為其類型的默認(rèn)值。
new操作符做的事情大致包括:
- 計算Dog類以及所有父類實例字段所占的字節(jié)數(shù)
- 計算Dog類以及所有父類"類型對象指針"和"同步塊索引"所占的字節(jié)數(shù)
- 根據(jù)字節(jié)數(shù),托管堆分配內(nèi)存
- 先調(diào)用所有父類的構(gòu)造函數(shù),最后調(diào)用Dog的構(gòu)造函數(shù)。在這過程中,初始化所有實例字段,字段值為字段類型的默認(rèn)值或構(gòu)造函數(shù)實參值;初始化"類型對象指針"和"同步塊索引"成員
- 把新建的Dog實例的堆地址賦值給棧變量dog
- 通過new創(chuàng)建的托管堆對象最終由GC回收
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
C#如何將查詢到的數(shù)據(jù)庫里面的數(shù)據(jù)輸出到textbox控件
這篇文章主要介紹了C#如何將查詢到的數(shù)據(jù)庫里面的數(shù)據(jù)輸出到textbox控件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

