目錄:
成都創(chuàng)新互聯(lián)公司主營(yíng)槐蔭網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,槐蔭h5重慶小程序開發(fā)搭建,槐蔭網(wǎng)站營(yíng)銷推廣歡迎槐蔭等地區(qū)企業(yè)咨詢
【C#小知識(shí)】C#中一些易混淆概念總結(jié)
----------------------------------分割線--------------------------------------
這幾天在溫習(xí)結(jié)構(gòu)體和類的時(shí)候遇到一個(gè)問題。發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象,一直找不到合理的答案。但是今天終于找到了合理的答案,所以拿來和大家分享一下。
我們首先來看下面的一段代碼:
class Program
{
static void Main(string[] args)
{
Point p;
Console.WriteLine(p);
Point p1 = new Point();
Console.WriteLine(p1);
Console.ReadKey();
}
}
//定義結(jié)構(gòu)
struct Point
{
////定義時(shí)賦初始值,編譯器會(huì)報(bào)錯(cuò)
//private int x;
//public Point()
//{ }
}
class Person
{
//在類中我們可以為屬性賦初始值
//private int nAge = 5;
//public int NAge
//{
// get { return nAge; }
// set { nAge = value; }
//}
}當(dāng)我們只是聲明一個(gè)類和一個(gè)結(jié)構(gòu)體的時(shí)候,我們的編譯器順利的編譯通過。并且打印出結(jié)果如下:

為什么我們沒有在結(jié)構(gòu)和類中做任何操作,卻可以打印出結(jié)果,且是“命名空間+"."+數(shù)據(jù)類型”呢?
首先我查閱了MSDN的關(guān)于結(jié)構(gòu)(struct)的官方文檔(地址點(diǎn)擊這里),有如下的一段話:

結(jié)構(gòu)默認(rèn)的構(gòu)造函數(shù)(如果沒有顯式聲明)在實(shí)例化的時(shí)候才會(huì)被調(diào)用。所以,
//結(jié)構(gòu)的實(shí)例化可以不使用NEW關(guān)鍵字,只是將p加載到棧空間中,但是對(duì)象不可用,這里沒有調(diào)用默認(rèn)的構(gòu)造函數(shù) Point p2; Console.WriteLine(p2); Console.ReadKey();
在內(nèi)存中是如下的情況:

此時(shí)在棧中已經(jīng)存在了p這個(gè)對(duì)象,但是不可用。
那么為什么會(huì)打印出“命名空間+"."+數(shù)據(jù)類型”的結(jié)果呢?
我們先看一下VS編譯后的中間代碼,即Msil,詳細(xì)解釋在圖中給出:

有中間語(yǔ)言代碼,我們可以知道,最后調(diào)用的是Console.WriteLine(Object)方法
這時(shí)候就要深入的研究一下Console類了,用反編譯工具.NET Reflector查看Console類,因?yàn)樵谏厦娴拇a中,傳進(jìn).WriteLine()方法的是一個(gè)類,所以,我們要查看它的的(object value)方法,如下圖:

這時(shí)候,我們?cè)偕钊氲絎riteLine()方法中去,源代碼,如下:

再看Out.WriteLine()的源代碼:

因?yàn)閜已經(jīng)在棧中創(chuàng)建了對(duì)象(但是不可用),所以,直接進(jìn)入else語(yǔ)句。
明顯的可以發(fā)現(xiàn)IFormattable是一個(gè)接口,我們?cè)倏碔Formattable接口的源碼,如下:

顯然我們的Point 結(jié)構(gòu)沒有實(shí)現(xiàn)一個(gè)ToString()方法,不存在繼承關(guān)系,所以會(huì)轉(zhuǎn)化失敗,返回一個(gè)null值,又進(jìn)入下一個(gè)else語(yǔ)句
else
{
this.WriteLine(value.ToString());
}
這時(shí)候最重要的就要來了,我們看到value值被轉(zhuǎn)換為字符串輸出了,在看ToString()源代碼,如下:

很明顯的發(fā)現(xiàn),是獲取該對(duì)象的數(shù)據(jù)類型并且轉(zhuǎn)化為字符串輸出。如下代碼:
Point p;
//打印出p的數(shù)據(jù)類型
Console.WriteLine(p.GetType());
Point p2;
Console.WriteLine(p2);
//使用NEW實(shí)例化了對(duì)像,調(diào)用了默認(rèn)的構(gòu)造函數(shù)
Point p1 = new Point();
Console.WriteLine(p1);
Console.ReadKey();打印結(jié)果:

這樣對(duì)結(jié)構(gòu)和類的了解有沒有更深入的了解呢?
如果您覺得不錯(cuò),點(diǎn)擊右下角贊一下吧!您的支持,是我寫作的動(dòng)力!
畢業(yè)實(shí)習(xí)交流群:221376964。你也可以關(guān)注我的新浪微博進(jìn)行交流。

網(wǎng)站標(biāo)題:【C#小知識(shí)】C#中一些易混淆概念總結(jié)(四)---------解析Console.WriteLine()
轉(zhuǎn)載來于:http://chinadenli.net/article32/ipcdpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、手機(jī)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、虛擬主機(jī)、動(dòng)態(tài)網(wǎng)站、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)