91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()

發布時間:2020-07-19 01:36:02 來源:網絡 閱讀:993 作者:yisuowushinian 欄目:編程語言

目錄:

【C#小知識】C#中一些易混淆概念總結

【C#小知識】C#中一些易混淆概念總結(二)

【C#小知識】C#中一些易混淆概念總結(三)

----------------------------------分割線--------------------------------------


這幾天在溫習結構體和類的時候遇到一個問題。發現一個奇怪的現象,一直找不到合理的答案。但是今天終于找到了合理的答案,所以拿來和大家分享一下。

我們首先來看下面的一段代碼:

class Program
    {
        static void Main(string[] args)
        {
            Point p;
            Console.WriteLine(p);
                                               
            Point p1 = new Point();
            Console.WriteLine(p1);
            Console.ReadKey();
        }
    }
    //定義結構
    struct Point
    {
        ////定義時賦初始值,編譯器會報錯
        //private int x;
        //public Point()
        //{ }
    }
    class Person
    {
        //在類中我們可以為屬性賦初始值
        //private int nAge = 5;
        //public int NAge
        //{
        //    get { return nAge; }
        //    set { nAge = value; }
        //}
    }


當我們只是聲明一個類和一個結構體的時候,我們的編譯器順利的編譯通過。并且打印出結果如下:

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()


為什么我們沒有在結構和類中做任何操作,卻可以打印出結果,且是“命名空間+"."+數據類型”呢?


首先我查閱了MSDN的關于結構(struct)的官方文檔(地址點擊這里),有如下的一段話:

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()


結構默認的構造函數(如果沒有顯式聲明)在實例化的時候才會被調用。所以,

//結構的實例化可以不使用NEW關鍵字,只是將p加載到棧空間中,但是對象不可用,這里沒有調用默認的構造函數         
Point p2;          
Console.WriteLine(p2);        
Console.ReadKey();

在內存中是如下的情況:

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()


此時在棧中已經存在了p這個對象,但是不可用。


那么為什么會打印出“命名空間+"."+數據類型”的結果呢?

我們先看一下VS編譯后的中間代碼,即Msil,詳細解釋在圖中給出:

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()


有中間語言代碼,我們可以知道,最后調用的是Console.WriteLine(Object)方法


這時候就要深入的研究一下Console類了,用反編譯工具.NET Reflector查看Console類,因為在上面的代碼中,傳進.WriteLine()方法的是一個類,所以,我們要查看它的的(object value)方法,如下圖:

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()


這時候,我們再深入到WriteLine()方法中去,源代碼,如下:

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()


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

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()

因為p已經在棧中創建了對象(但是不可用),所以,直接進入else語句。


明顯的可以發現IFormattable是一個接口,我們再看IFormattable接口的源碼,如下:

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()


顯然我們的Point 結構沒有實現一個ToString()方法,不存在繼承關系,所以會轉化失敗,返回一個null值,又進入下一個else語句

else

 {          

this.WriteLine(value.ToString());    

  }

這時候最重要的就要來了,我們看到value值被轉換為字符串輸出了,在看ToString()源代碼,如下:

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()


很明顯的發現,是獲取該對象的數據類型并且轉化為字符串輸出。如下代碼:

Point p;
            //打印出p的數據類型
            Console.WriteLine(p.GetType());
            Point p2;
            Console.WriteLine(p2);
           //使用NEW實例化了對像,調用了默認的構造函數
            Point p1 = new Point();
            Console.WriteLine(p1);
            Console.ReadKey();


打印結果:

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()



這樣對結構和類的了解有沒有更深入的了解呢?



如果您覺得不錯,點擊右下角贊一下吧!您的支持,是我寫作的動力!

畢業實習交流群:221376964。你也可以關注我的新浪微博進行交流。

【C#小知識】C#中一些易混淆概念總結(四)---------解析Console.WriteLine()


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳高县| 崇州市| 绿春县| 奎屯市| 芮城县| 察隅县| 汕头市| 容城县| 青阳县| 苗栗市| 京山县| 海晏县| 辽宁省| 连州市| 绵阳市| 荥经县| 剑川县| 武山县| 永修县| 红安县| 岳西县| 滨州市| 安庆市| 盘锦市| 伊金霍洛旗| 称多县| 扎囊县| 开封市| 桐庐县| 游戏| 德江县| 合阳县| 衡阳市| 九江县| 积石山| 永寿县| 封开县| 阳泉市| 石狮市| 大邑县| 东城区|