這是本系列讀書心得第一篇。
其實所謂核心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 中國大陸許可協議進行許可。