《C#高級編程》 讀書心得1--核心C# 幾點你可能沒注意,但很基礎的小東西。


這是本系列讀書心得第一篇。

其實所謂核心C#也就是C#的語法基礎,相信大家應該已經非常熟悉了,在這里說一下在書中看到,大家可能平時沒有太注意到的。此篇比較基礎,也是第一次寫讀書心得,請勿噴啊。

變量以及其作用域。

     首先聲明變量:可以直接用int i; 其實它是聲明一個名為i 的System.Int32的一個實例。 像int, long這樣的關鍵字都是指向.NET預定義類型,也就是說用他們聲明的變量是他們所指向的.NET預定義類型的一個實例。在.net中一共有15個這樣的預定義類型,13個值類型,2個引用類型(object和string)。如int 對應的System.Int32, long對應System.Int64。 就像大學的時候我們C語言的老師一直都說int變量的值范圍為-32768~32767,是因為當時的C語言編譯環境為16位。 還要強調一點就是string字符串在C#中為引用類型,也就是說一個string變量是存儲在托管堆上的,而像int這樣的值類型是存儲在堆棧上。

    我們在int上按F12跳轉到定義就會看到它其實是一個結構體:public struct Int32, 所一它存儲在堆棧上,而string的定義是public sealed class String是一個類。

    在定義一個string a后,並沒有為其初始化a的值為null,而int a后a默認為0。 再有string a="123" 聲明了一個string類型,然后對其再次賦值a="456",會再次創建一個值為456的實例,而不是修改值為123的實例。int a=9之后int b=a 這樣在內存中會生成兩個值為9的int結構體實例在堆棧中。還有bool變量只接受true或者false,而不會接受0或者1不會對其隱式類型轉換。bool變量的默認值為false。

    關於int對應System.Int32,bool對應System.Boolean等其實都是結構,他們都是繼承於System.ValueType, 而System.VauleType又繼承與System.Object. 所以他們的實例都可以進行ToString()這樣的操作。String就直接繼承與System.object。

    關於變量的作用域有這樣一個有趣的事,請看下面兩段代碼

 1     class Program1
 2     {
 3         private static void Main(string[] args)
 4         {
 5             int j = 20;
 6             for (int i = 0; i < 10; i++)
 7             {
 8                 int j = 30;
 9                 Console.WriteLine(j + 1);
10             }
11         }
12     }
 1 class Program2
 2     {
 3         private static int j = 20;
 4         static void Main(string[] args)
 5         {
 6             int j = 30;
 7             Console.WriteLine(j);
 8             return;
 9         }
10     }

 

        第一段代碼運行后會報錯,變量j重復定義。

        而對於第二段,有人也會認為他會報錯,但運行后會輸出變量j 為30。 這是因為變量聲明在類中,C#就認為它為類的字段,Main方法中的j為局部變量。在main方法中聲明j局部變量后類中的字段j被隱藏,所以編譯成功,如果要類級別上的j可以用Program2.j。但為了代碼的可讀性我們在代碼中避免這樣的寫法。

 

關於常量 const 和readonly的區別。

        先說常量,常量必須在聲明時初始化,之后不可修改,常量的值必須在編譯時就可以計算出來,不可以用一個變量中提取出的值來初始化常量。常量是靜態的,但要是加上static關鍵字會報錯。

        而只讀字段readonly,它要比const常量要靈活,他一般在生成實例,在構造函數中初始化,實例生成后其值也就不可變化了,所以自讀字段的值只要在生成實例之前能夠計算出來就是可以的。

 預處理指令

        書中列舉了很多預處理指令,有很多之前都沒有用過,但相信應該都有用過#region  #endregion 去折疊一段代碼。這里要說明一下#if DEBUG #else #endif(請注意,在C#預指令里是也是區分大小寫的)。請看下段代碼。

 1  static void Main(string[] args)
 2         {
 3             Console.WriteLine("Always write");
 4 
 5 #if DEBUG
 6      Console.WriteLine("Write When Debug");
 7 #else
 8      Console.WriteLine("Write When Release");
 9 #endif
10 
11             Console.ReadLine();
12 
13             return;
14 
15 
16         }

 

  運行的話會看到效果,當選擇DEBUG 模式進行調試的話,DEBUG就會為真,當選擇Release的話,DEBUG就會為假。當然可能有的版本VS會要進行一下設置,右鍵點擊項目,選擇屬性,“生成”選顯卡里,選定“定義DEBUG常量”。這樣DEBUG常量才會生效。此方法在調試一些登陸后后才可見的功能比較有用,調試的時候誰也不想每次登錄這么麻煩吧。

 

知識共享許可協議
本作品采用知識共享署名-非商業性使用-相同方式共享 2.5 中國大陸許可協議進行許可。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM