真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

構(gòu)造器和引用類型是什么

今天就跟大家聊聊有關(guān)構(gòu)造器和引用類型是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)公司是專業(yè)的巧家網(wǎng)站建設(shè)公司,巧家接單;提供網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行巧家網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

引用類型
構(gòu)造器是將類型的實例初始化為良好狀態(tài)的特殊方法,創(chuàng)建引用類型的實例時,首先為實例的數(shù)據(jù)字段分配內(nèi)存,然后初始化對象的附加字段(類型對象指針和同步塊索引),最后調(diào)用類型的實例構(gòu)造器來設(shè)置對象的初始化狀態(tài)。
構(gòu)造引用類型對象時,在電泳類型的實例構(gòu)造器之前,為對象分配的內(nèi)存總是先被歸0,沒有被構(gòu)造器顯示重寫的所有字段都保證獲得0或null值。
和其他方法不同,實力構(gòu)造器永遠(yuǎn)不能被繼承,也就是說,類只有類自己定義的還順利構(gòu)造器。由于永遠(yuǎn)不能繼承實例構(gòu)造器,所以實例構(gòu)造器不能使用以下修飾符:Virtual,new,override,sealed和abstract。如果類沒有顯示定義任何構(gòu)造器,C#編譯器將默認(rèn)一個默認(rèn)無參構(gòu)造器,在她的實現(xiàn)中,只是簡單的調(diào)用了基類的無參構(gòu)造函數(shù)。
如果類的修飾符為abstract,那么編譯器生成的默認(rèn)構(gòu)造器的可訪問性就為product;否則,構(gòu)造器會被賦予public可訪問屬性。如果基類沒有提供無參構(gòu)造器,那么派生類必須顯示調(diào)用一個基類構(gòu)造器,否則編譯器會報錯。如果類的修飾符為static(sealed和abstract),編譯器根本不會再類的定義中生成默認(rèn)的構(gòu)造器。
一個類型可以定義多個實例構(gòu)造器。每個構(gòu)造器都必須有不同的簽名,而且每個都可以有不同的可訪問屬性。為了使代碼“可驗證”,類的實力構(gòu)造器在訪問從基類繼承的任何字段前,必須先調(diào)用基類的構(gòu)造器。如果派生類的構(gòu)造器沒有顯示調(diào)用一個基類構(gòu)造器,C#編譯器會自動生成對默認(rèn)的基類構(gòu)造器的調(diào)用。最終,System.Object的公共無參構(gòu)造器會得到調(diào)用。該構(gòu)造器什么都不做,會直接返回,由于System.Object沒有實例數(shù)據(jù)字段,所以它的構(gòu)造器無事可做。
極少數(shù)情況下可以在不調(diào)用實例構(gòu)造器的前提下創(chuàng)建類型實例。一個典型的例子就是Object的MemberwiseClone方法。該方法的作用是分配內(nèi)存,初始化對象的附加字段,然后將源對象的自己數(shù)據(jù)復(fù)制到新對象中。另外,用運(yùn)行時序列化器(runtime seriallizer)反序列化對象時,同程也不需要調(diào)用構(gòu)造器。反序列化使用System.Runtime.Serialization.FormatterServices類型的GetUninitalizedObject或者GetSafeUninitailizedObject方法為對象分配內(nèi)存,期間不會調(diào)用一個構(gòu)造器。
提示:
不要再構(gòu)造器中調(diào)用虛方法。原因是假如被實例化的類型重寫了虛方法,就會執(zhí)行派生類型對虛方法的實現(xiàn),但是在這個時候,尚未完成對繼承層次結(jié)構(gòu)中所有字段的初始化(被實例化的類型的構(gòu)造器還沒有運(yùn)行)。所以,調(diào)用虛方法會導(dǎo)致無法預(yù)測的行為。歸根到底,這是由于調(diào)用虛方法時,直到運(yùn)行時之前都不會選擇執(zhí)行該方法的實際類型。
值類型(struct)構(gòu)造器
值類型(struct)構(gòu)造器的工作方式與引用類型(class)的構(gòu)造器截然不同。CLR總是允許創(chuàng)建值類型的實例,并且沒有辦法阻止值類型的實例化。所以,值類型其實并不需要定義構(gòu)造器,C#編譯器根本不會為值類型內(nèi)聯(lián)默認(rèn)無參構(gòu)造器。來看下面代碼:
internal struct Point {
public int m_x, m_y;
}
internal sealed class Reactangel
{
public Point m_TopLeft, m_bottomRight;
}
為了構(gòu)造一個Rectangle,必須使用new操作符,而且必須指定構(gòu)造器。在這個例子中,調(diào)用的是C#編譯器自動生成的默認(rèn)構(gòu)造器。為Reatangle分配內(nèi)存,內(nèi)存中包含Point值類型的兩個實例。考慮到性能,CLR不會為包含在引用類型中的每個值類型字段都主動調(diào)用構(gòu)造器,但是,如前所述,值類型的字段都會被初始化為0或null。
CLR確實允許為值類型定義構(gòu)造器,但是必須顯示調(diào)用才會執(zhí)行。
internal struct Point {
public int m_x, m_y;
public Point(int x, int y)
{
m_x = x;
m_y = y;
}
}
internal sealed class Reactangel
{
public Point m_TopLeft, m_bottomRight;
public Reactangel()
{
this.m_TopLeft = new Point(1,2);
this.m_bottomRight = new Point(100,200);
}
}
值類型的實例構(gòu)造器只有顯示調(diào)用才會執(zhí)行。因此,如果Rectangle的構(gòu)造器沒有使用new操作符來調(diào)用Point的構(gòu)造器,從而初始化Reatangle的m_TopLeft和m_bottomRight字段,那么兩個point字段中的m_x和m_y字段都將為0.
將上面代碼改寫:
internal struct Point {
public int m_x, m_y;
public Point()
{
m_x = 5;
m_y = 6;
}
}
internal sealed class Reactangel
{
public Point m_TopLeft, m_bottomRight;
public Reactangel()
{
}
}
現(xiàn)在,構(gòu)造新的Rectangle類時,兩個Point字段中的m_x和m_y字段會被初始化多少,是0還是5?
可能你會覺得C#編譯器會子啊Reactangel的構(gòu)造器中生成代碼,為Reactangel的兩個字段自動調(diào)用Point的默認(rèn)無參構(gòu)造器。但是,為了增強(qiáng)應(yīng)用程序的運(yùn)行時性能,C#編譯器不會自動生成這樣的代碼。實際上,即便值類型提供了無參構(gòu)造器,許多編譯器也永遠(yuǎn)不會生成代碼來調(diào)用它,為了執(zhí)行值類型無參構(gòu)造器,開發(fā)人員必須增加顯示調(diào)用值類型構(gòu)造器的代碼。但是會由于這個原因Point‘的兩個字段被初始化為0嗎?結(jié)果是:
構(gòu)造器和引用類型是什么
C#編譯器故意不允許值類型定義無參構(gòu)造器,目的是防止開發(fā)人員對這種構(gòu)造器在什么時候調(diào)用產(chǎn)生迷惑。由于不能定義無參構(gòu)造器,所以編譯器永遠(yuǎn)不會生成自動調(diào)用它的代碼,沒有無參構(gòu)造器,值類型的字段總是被初始化為0或null。
類型構(gòu)造器:
也稱為靜態(tài)構(gòu)造器,類構(gòu)造器或者類型初初始化器。類型構(gòu)造器可應(yīng)用與引用類型和值類型。實例構(gòu)造器的作用是設(shè)置類型的實例的初始狀態(tài)。對應(yīng)的,類型構(gòu)造器的作用是設(shè)置類型的初始狀態(tài)。類型默認(rèn)沒有定義類型構(gòu)造器,如果定義,也只能有一個。此外,類型構(gòu)造器永遠(yuǎn)沒有參數(shù)。
internal sealed class SomeRefType {
static SomeRefType()
{
//首次訪問時,執(zhí)行這里的代碼
}
}
internal struct SomeValType
{
static SomeValType()
{
//首次訪問時,執(zhí)行這里的代碼
}
}
可以看出,定義類型構(gòu)造器類似于定義無參實例構(gòu)造器,區(qū)別在于必須標(biāo)記為static。此外,類型構(gòu)造器總是私有的。之所以私有,是為了防止任何開發(fā)人員寫代碼調(diào)用它,對他的調(diào)用總是有CLR負(fù)責(zé)。
提示:
雖然能在值類型中定義類型構(gòu)造器,但永遠(yuǎn)不要真的那么做,因為CLR有時不會調(diào)用值類型的靜態(tài)構(gòu)造器:例如
internal struct SomeValType
{
static SomeValType()
{
Console.WriteLine("這句話永遠(yuǎn)不會顯示");
}
public int m_x;
}
class Program
{
static void Main(string[] args)
{
SomeValType[] a = new SomeValType[10];
a[0].m_x = 123;
Console.WriteLine(a[0].m_x);
Console.ReadKey();
}
}
類型構(gòu)造器的代碼只能訪問類型的靜態(tài)字段,并且他的非常規(guī)用途就是初始化這些字段。

看完上述內(nèi)容,你們對構(gòu)造器和引用類型是什么有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


本文題目:構(gòu)造器和引用類型是什么
轉(zhuǎn)載源于:http://weahome.cn/article/pgssds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部